{"id":7509,"date":"2018-06-01T22:55:50","date_gmt":"2018-06-01T14:55:50","guid":{"rendered":"http:\/\/rmohan.com\/?p=7509"},"modified":"2018-06-01T22:55:50","modified_gmt":"2018-06-01T14:55:50","slug":"redis-install","status":"publish","type":"post","link":"https:\/\/mohan.sg\/?p=7509","title":{"rendered":"Redis install"},"content":{"rendered":"<p>Install<br \/>\n&#8212;&#8212;-<br \/>\nhttp:\/\/download.redis.io\/redis-stable.tar.gz<\/p>\n<p>$ wget http:\/\/download.redis.io\/redis-stable.tar.gz<br \/>\n$ tar xvzf redis-stable.tar.gz<br \/>\n$ cd redis-stable<br \/>\n$ make<br \/>\n$ make test # optional<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n# yum install wget tcl<br \/>\n# wget http:\/\/download.redis.io\/releases\/redis-3.2.5.tar.gz<br \/>\n# tar xzf redis-3.2.5.tar.gz<br \/>\n# cd redis-3.2.5<br \/>\n# make<br \/>\n# make test<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n$ sudo make install<br \/>\nOR<br \/>\n$ sudo cp src\/redis-server \/usr\/local\/bin\/<br \/>\n$ sudo cp src\/redis-cli \/usr\/local\/bin\/<br \/>\n$ sudo mkdir \/etc\/redis<br \/>\n$ sudo mkdir \/var\/redis<br \/>\n$ sudo cp utils\/redis_init_script \/etc\/init.d\/redis_6379<br \/>\n$ sudo cp redis.conf \/etc\/redis\/6379.conf<br \/>\n$ sudo mkdir \/var\/redis\/6379<br \/>\n$ sudo update-rc.d redis_6379 defaults # OR sudo chkconfig &#8211;add redis_6379<br \/>\n$ sudo \/etc\/init.d\/redis_6379 start<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>TERMS<br \/>\n&#8212;&#8211;<br \/>\nRESP (REdis Serialization Protocol)<br \/>\nRESP, the type of some data depends on the first byte:<br \/>\nSimple Strings &#8220;+&#8221;<br \/>\nErrors &#8220;-&#8221;<br \/>\nIntegers &#8220;:&#8221;<br \/>\nBulk Strings &#8220;$&#8221;<br \/>\nArrays &#8220;*&#8221;<br \/>\nRedis append-only file feature (AOF)<\/p>\n<p>COMMANDS<br \/>\n&#8212;&#8212;&#8211;<br \/>\n$ redis-server # start server<br \/>\n\/etc\/init.d\/redis_PORT start<br \/>\n$ redis-cli [-p PORT] shutdown # stop server<br \/>\n\/etc\/init.d\/redis_PORT stop<br \/>\n$ redis-cli ping # check if working<br \/>\n$ redis-cli &#8211;stat [-i interval] # continuous stats mode<br \/>\n$ redis-cli &#8211;bigkeys # scan for big keys<br \/>\n$ redis-cli [-p port ] &#8211;scan [&#8211;pattern REGEX] # get a list of keys<br \/>\n$ redis-cli [-p port ] monitor # monitor commands<br \/>\n$ redis-cli [-p port ] &#8211;latency # monitor latency of instances<br \/>\n$ redis-cli [-p port ] &#8211;latency-history [-i interval]<br \/>\n$ redis-cli [-p port ] &#8211;latency-dist # spectrum of latencies<br \/>\n$ redis-cli &#8211;intrinsic-latency [-p port ] [test-time] # latency of system<br \/>\n$ redis-cli &#8211;intrinsic-latency 5<br \/>\n$ redis-cli &#8211;rdb &lt;dest-filename&gt; # remote RDB backup ($?=0 success)<br \/>\n$ redis-cli &#8211;rdb \/tmp\/dump.rdb<br \/>\n$ redis-cli &#8211;slave # slave mode (monitor master -&gt; slave writes)<br \/>\n$ redis-cli &#8211;lru-test 10000000 # Least Recently Used (LRU) simulation<br \/>\n# used to help configure &#8216;maxmemory&#8217; for LRU<br \/>\n$ redis-cli save # save dump file (dump.rdb) to $dir<br \/>\n$ redis-cli select &lt;DB_NUMBER&gt; # select DB<br \/>\n$ redis-cli dbsize # show size of DB<br \/>\n$ redis-cli connect &lt;SERVER&gt; &lt;PORT&gt; # connect to different servers\/ports<br \/>\n$ redis-cli debug restart<br \/>\n$ redis-cli &#8211;version<br \/>\n$ redis-cli pubsub channels [PATTERN]<br \/>\n$ redis-cli pubsub numsub [channel1 &#8230; channelN]<br \/>\n$ redis-cli subscribe\/psubscribe\/publish<br \/>\n$ redis-cli slowlog get [N]|len<br \/>\na. unique progressive identifier for every slow log entry.<br \/>\nb. timestamp at which the logged command was processed.<br \/>\nc. amount of time needed for its execution, in microseconds.<br \/>\nd. array composing the arguments of the command.<\/p>\n<p>FILES<br \/>\n&#8212;&#8211;<br \/>\nconfig file: \/etc\/redis\/6371.conf<br \/>\ndbfilename dump.rdb<br \/>\ndir \/var\/lib\/redis\/6371<br \/>\npidfile \/var\/run\/redis\/6371.pid<br \/>\nDB saved to:<br \/>\n\/var\/lib\/redis\/6371\/dump.rdb<\/p>\n<p>OPTIONS<br \/>\n&#8212;&#8212;-<br \/>\n&#8211;raw, &#8211;no-raw<\/p>\n<p>Configuration<br \/>\n&#8212;&#8212;&#8212;&#8212;-<br \/>\nredis.conf # well documented<br \/>\ndefault ports: 6379 \/ 16379 (cluster mode) \/ 26379 (Sentinel)<\/p>\n<p>daemonize no<br \/>\npidfile \/var\/run\/redis_6379.pid<br \/>\nport 6379<br \/>\nloglevel info<br \/>\nlogfile \/var\/log\/redis_6379.log<br \/>\ndir \/var\/redis\/6379<\/p>\n<p>keyword argument1 argument2 &#8230; argumentN<\/p>\n<p>slaveof 127.0.0.1 6380<br \/>\nrequirepass &#8220;hello world&#8221;<br \/>\nmaxmemory 2mb<br \/>\nmaxmemory-policy allkeys-lru<br \/>\nmasterauth &lt;password&gt;<br \/>\ndaemonize no # when run under daemontools<\/p>\n<p>Administration<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n\/etc\/sysctl.conf<br \/>\n&#8212;<br \/>\nvm.overcommit_memory = 1 # sysctl vm.overcommit_memory=1<br \/>\necho never &gt; \/sys\/kernel\/mm\/transparent_hugepage\/enabled<\/p>\n<p># passing arguments via CLI<br \/>\n$ .\/redis-server &#8211;port 6380 &#8211;slaveof 127.0.0.1 6379<\/p>\n<p>redis&gt; config get GLOB<br \/>\nredis&gt; config set slaveof 127.0.0.1 6380<br \/>\nredis&gt; config rewrite<\/p>\n<p>&#8212; &#8212;<br \/>\nActual config<br \/>\n&#8212;<br \/>\ndaemonize yes<br \/>\npidfile \/var\/run\/redis\/6371.pid<br \/>\nport 6371<br \/>\ntcp-backlog 511<br \/>\nbind 0.0.0.0<br \/>\ntimeout 0<br \/>\ntcp-keepalive 0<br \/>\nloglevel notice<br \/>\nlogfile &#8220;&#8221;<br \/>\nsyslog-enabled yes<br \/>\nsyslog-ident redis<br \/>\nsyslog-facility USER<br \/>\ndatabases 16<br \/>\nsave 900 1<br \/>\nsave 300 10<br \/>\nsave 60 10000<br \/>\nstop-writes-on-bgsave-error yes<br \/>\nrdbcompression yes<br \/>\nrdbchecksum yes<br \/>\ndbfilename dump.rdb<br \/>\ndir \/var\/lib\/redis\/6371<br \/>\nslaveof 10.200.18.115 6371 # only on slave(s)<br \/>\nslave-serve-stale-data yes<br \/>\nslave-read-only yes<br \/>\nrepl-disable-tcp-nodelay no<br \/>\nslave-priority 100<br \/>\nmaxclients 10000<br \/>\nmaxmemory-policy noeviction<br \/>\nappendonly no<br \/>\nappendfilename &#8220;appendonly.aof&#8221;<br \/>\nappendfsync everysec<br \/>\nno-appendfsync-on-rewrite no<br \/>\nauto-aof-rewrite-percentage 100<br \/>\nauto-aof-rewrite-min-size 64mb<br \/>\nlua-time-limit 5000<br \/>\nslowlog-log-slower-than 10000<br \/>\nslowlog-max-len 128<br \/>\nnotify-keyspace-events &#8220;&#8221;<br \/>\nhash-max-ziplist-entries 512<br \/>\nhash-max-ziplist-value 64<br \/>\nlist-max-ziplist-entries 512<br \/>\nlist-max-ziplist-value 64<br \/>\nset-max-intset-entries 512<br \/>\nzset-max-ziplist-entries 128<br \/>\nzset-max-ziplist-value 64<br \/>\nactiverehashing yes<br \/>\nclient-output-buffer-limit normal 0 0 0<br \/>\nclient-output-buffer-limit slave 256mb 64mb 60<br \/>\nclient-output-buffer-limit pubsub 32mb 8mb 60<br \/>\nhz 10<br \/>\naof-rewrite-incremental-fsync yes<br \/>\n&#8212;<\/p>\n<p>Replication<br \/>\n&#8212;&#8212;&#8212;&#8211;<br \/>\nredis&gt; config set masterauth &lt;password&gt;<br \/>\npersistence = enabled OR automatic-restarts = disabled<\/p>\n<p>slaveof 192.168.1.1 6379<br \/>\nrepl-diskless-sync<br \/>\nrepl-diskless-sync-delay<br \/>\nslave-read-only<br \/>\nmasterauth &lt;password&gt; # config set masterauth &lt;password&gt;<br \/>\nmin-slaves-to-write &lt;number of slaves&gt;<br \/>\nmin-slaves-max-lag &lt;number of seconds&gt;<br \/>\nslave-announce-ip 5.5.5.5<br \/>\nslave-announce-port 1234<\/p>\n<p>Redis Sentinel (26379)<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8211; Monitoring<br \/>\n&#8211; Notification<br \/>\n&#8211; Automatic failover<br \/>\n&#8211; Configuration provider<\/p>\n<p>redis-sentinel \/path\/to\/sentinel.conf<br \/>\nOR<br \/>\nredis-server \/path\/to\/sentinel.conf &#8211;sentinel<\/p>\n<p># typical minimal config<br \/>\n&#8212;<br \/>\n# sentinel monitor &lt;master-group-name&gt; &lt;ip&gt; &lt;port&gt; &lt;quorum&gt;<br \/>\n# sentinel down-after-milliseconds &lt;master-name&gt; &lt;milliseconds&gt; # default 30 secs<br \/>\n# sentinel failover-timeout &lt;master-name&gt; &lt;milliseconds&gt; # default 3 minutes<br \/>\n# sentinel parallel-syncs &lt;master-name&gt; &lt;numslaves&gt;<br \/>\n&#8212;<br \/>\n# example typical minimal config:<br \/>\n&#8212;<br \/>\nsentinel monitor mymaster 127.0.0.1 6379 2<br \/>\nsentinel down-after-milliseconds mymaster 60000<br \/>\nsentinel failover-timeout mymaster 180000<br \/>\nsentinel parallel-syncs mymaster 1<br \/>\n&#8212;<br \/>\n# additional configs<br \/>\n&#8212;<br \/>\n# bind 127.0.0.1 192.168.1.1<br \/>\n# protected-mode no<br \/>\n# sentinel announce-ip &lt;ip&gt;<br \/>\n# sentinel announce-port &lt;port&gt;<br \/>\n# dir &lt;working-directory&gt;<br \/>\n# syntax: sentinel &lt;option_name&gt; &lt;master_name&gt; &lt;option_value&gt;<br \/>\n# sentinel auth-pass &lt;master-name&gt; &lt;password&gt;<br \/>\n# sentinel down-after-milliseconds &lt;master-name&gt; &lt;milliseconds&gt; # default 30 secs<br \/>\n# sentinel parallel-syncs &lt;master-name&gt; &lt;numslaves&gt;<br \/>\n# sentinel failover-timeout &lt;master-name&gt; &lt;milliseconds&gt; # default 3 minutes<br \/>\n# sentinel notification-script &lt;master-name&gt; &lt;script-path&gt;<br \/>\n# passed: &lt;event type&gt; &lt;event description&gt;<br \/>\n# sentinel client-reconfig-script &lt;master-name&gt; &lt;script-path&gt;<br \/>\n# passed: &lt;master-name&gt; &lt;role&gt; &lt;state&gt; &lt;from-ip&gt; &lt;from-port&gt; &lt;to-ip&gt; &lt;to-port&gt;<br \/>\n# &lt;state&gt; is currently always &#8220;failover&#8221;<br \/>\n# &lt;role&gt; is either &#8220;leader&#8221; or &#8220;observer&#8221;<br \/>\n&#8212; &#8212; &#8212;<br \/>\n# actual config<br \/>\n&#8212;<br \/>\n\/etc\/redis\/sentinel_26371.conf<br \/>\n# redis-sentinel 2.8.9 configuration file<br \/>\n# sentinel_26371.conf<br \/>\ndaemonize no<br \/>\ndir &#8220;\/var\/lib\/redis\/sentinel_26371&#8221;<br \/>\npidfile &#8220;\/var\/run\/redis\/sentinel_26371.pid&#8221;<br \/>\nport 26371<br \/>\nbind 0.0.0.0<br \/>\nsentinel monitor iowa_master_staging 10.200.18.115 6375 2<br \/>\nsentinel config-epoch iowa_master_staging 0<br \/>\nsentinel leader-epoch iowa_master_staging 0<br \/>\nsentinel known-slave iowa_master_staging 10.200.20.234 6375<br \/>\nlogfile &#8220;&#8221;<br \/>\nsyslog-enabled yes<br \/>\nsyslog-ident &#8220;sentinel_26371&#8221;<br \/>\nsyslog-facility user<br \/>\n&#8212;&#8212;&#8212;&#8212;-<br \/>\n# sentinel messages\/events<br \/>\n&#8212;<br \/>\n+monitor master &lt;group-name&gt; &lt;ip&gt; quorum &lt;N&gt;<\/p>\n<p># Testing<br \/>\n$ redis-cli -p PORT<br \/>\n127.0.0.1:PORT&gt; SENTINEL master mymaster # info about master<br \/>\n127.0.0.1:PORT&gt; SENTINEL slaves mymaster # info about slave(s)<br \/>\n127.0.0.1:PORT&gt; SENTINEL sentinels mymaster # info about sentinel(s)<br \/>\n127.0.0.1:PORT&gt; SENTINEL get-master-addr-by-name mymasterer # get address of master<br \/>\n$ redis-cli -p 6379 DEBUG sleep 30 # simulate master hanging<br \/>\n&#8212;<br \/>\nping<br \/>\nSENTINEL masters # get list of monitored masters and their state<br \/>\nSENTINEL master &lt;master name&gt;<br \/>\nSENTINEL slaves &lt;master name&gt;<br \/>\nSENTINEL sentinels &lt;master name&gt;<br \/>\nSENTINEL get-master-addr-by-name &lt;master name&gt;<br \/>\nSENTINEL reset &lt;pattern&gt; # reset all masters matching pattern<br \/>\nSENTINEL failover &lt;master name&gt; # force a failover<br \/>\nSENTINEL ckquorum &lt;master name&gt; # check if current config is able to failover<br \/>\nSENTINEL flushconfig # rewrite config file<br \/>\nSENTINEL monitor &lt;name&gt; &lt;ip&gt; &lt;port&gt; &lt;quorum&gt; # start monitoring a new master<br \/>\nSENTINEL remove &lt;name&gt; # stop monitoring master<br \/>\nSENTINEL SET &lt;name&gt; &lt;option&gt; &lt;value&gt;<br \/>\n&#8212;<br \/>\n# Commands<br \/>\n$<\/p>\n<p>Redis Cluster<br \/>\n&#8212;&#8212;&#8212;&#8212;-<br \/>\nport 7000<br \/>\ncluster-enabled yes<br \/>\ncluster-config-file nodes.conf<br \/>\ncluster-node-timeout 5000<br \/>\nappendonly yes<\/p>\n<p>=====================================<br \/>\nredis1:$ WTFI redis-cli =&gt; \/nb\/redis\/bin\/redis-cli<\/p>\n<p>redis-cli -h &lt;hostname&gt; -p &lt;port&gt; -r &lt;repeat (-1=forever)&gt; -i &lt;interval (secs)&gt; -n &lt;DB_NUM&gt; &lt;COMMAND&gt;<br \/>\nredis-cli -p 6371|26371 info [server|clients|memory|persistence|stats|replication|cpu|keyspace|sentinel]<br \/>\nredis-cli -p 6371 ping<br \/>\n=====================================<br \/>\nUpgrading or restarting a Redis instance without downtime<br \/>\nCheck out: https:\/\/redis.io\/topics\/admin (bottom)<br \/>\n=====================================<br \/>\nfor p in $(grep ^port \/etc\/redis\/*|awk &#8216;{print $NF}&#8217;); do echo &#8220;&#8212;- port: $p &#8212;-&#8220;; \/nb\/redis\/bin\/redis-cli -p $p info | grep stat; done<\/p>\n<p>========== tool (redis_monit.sh) [begin] ==========<br \/>\n#!\/bin\/bash<br \/>\n# get status of redis servers<br \/>\nREDIS_CLI_CMD=\/nb\/redis\/bin\/redis-cli<br \/>\n# get the list of ports configured<br \/>\nports=$(ls \/etc\/redis\/*.conf | tr -d &#8216;[a-z\/.]&#8217;)<br \/>\nfor port in $ports; do<br \/>\necho &#8220;&#8212;- port: $port &#8212;-&#8221;<br \/>\nif [ -e \/etc\/redis\/$port.conf ]; then<br \/>\n$REDIS_CLI_CMD -p $port info | grep stat<br \/>\nelse<br \/>\necho &#8220;no config (\/etc\/redis\/$port.conf)&#8221;<br \/>\nfi<br \/>\ndone<br \/>\n========== tool (redis_monit.sh) [end] ==========<\/p>\n<p># update the monitor hosts &#8211; &#8220;live&#8221;<br \/>\nsentinel monitor mymaster 127.0.0.1 6379 2<br \/>\nsentinel monitor redis2 10.204.21.219 6379 2<br \/>\nsentinel failover redis1<br \/>\nsentinel masters<br \/>\nsentinel slaves redis1<\/p>\n<p># manual failover<br \/>\n# CLUSTER FAILOVER [FORCE|TAKEOVER]<\/p>\n<p>$ redis-cli -p 7002 debug segfault<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Install &#8212;&#8212;- http:\/\/download.redis.io\/redis-stable.tar.gz<\/p>\n<p>$ wget http:\/\/download.redis.io\/redis-stable.tar.gz $ tar xvzf redis-stable.tar.gz $ cd redis-stable $ make $ make test # optional &#8212;&#8212;&#8212;&#8212;&#8211; # yum install wget tcl # wget http:\/\/download.redis.io\/releases\/redis-3.2.5.tar.gz # tar xzf redis-3.2.5.tar.gz # cd redis-3.2.5 # make # make test &#8212;&#8212;&#8212;&#8212;&#8211; $ sudo make install OR $ sudo cp src\/redis-server \/usr\/local\/bin\/ $ sudo cp [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[79],"tags":[],"_links":{"self":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/7509"}],"collection":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7509"}],"version-history":[{"count":1,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/7509\/revisions"}],"predecessor-version":[{"id":7510,"href":"https:\/\/mohan.sg\/index.php?rest_route=\/wp\/v2\/posts\/7509\/revisions\/7510"}],"wp:attachment":[{"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mohan.sg\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}