What is Redis Cluster Redis cluster is a distributed database solution provided by Redis. The cluster shares data through sharding and provides replication and failover functions. node A Redis cluster usually consists of multiple nodes. At the beginning, each node is independent of each other. They are all in a cluster that only contains themselves. To form a truly working cluster, we must connect the independent nodes to form a cluster containing multiple nodes. Cluster Configuration Configuration Files Download the configuration file: https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf Adjust the CLUSTER node configuration # Enable cluster cluster-enabled yes # Cluster configuration file cluster-config-file nodes-6379.conf # Cluster node timeout cluster-node-timeout 15000 Docker quickly builds a Redis cluster Install Redis Reference article: https://www.jb51.net/article/150054.htm Preparation ├── conf │ ├── redis.conf │ └── sentinel.conf ├── redis │ ├── data_6379 │ ├── data_6380 │ ├── data_6381 │ ├── data_6382 │ ├── data_6383 │ └── data_6384 └── scripts ├── cluster.sh ├── run.sh └── sentinel.sh run.sh script file #!/usr/bin/env bash set -e # Script current directory cPath=$(cd $(dirname "$0") || exit; pwd) # Root directory dirPath=$(dirname "$cPath") # Get the port port="$1" if [[ ! "$port" ]]; then port=6379 fi # Create a data directory mkdir -p "$dirPath"/redis/data_"$port" # Delete the started service containerId=$(docker ps -a | grep "redis_$port" | awk -F' ' '{print $1}') if [[ "$containerId" ]]; then docker rm -f ${containerId} > /dev/null fi # Start the service containerName=redis_"$port" docker run -itd --privileged=true -p "$port":6379 --name ${containerName} \ -v="$dirPath"/conf/redis.conf:/etc/redis/redis.conf \ -v="$dirPath"/redis/data_"$port":/data \ redis \ redis-server /etc/redis/redis.conf > /dev/null # Get the container IP address dockerIp=$(docker inspect -f "{{.NetworkSettings.IPAddress}}" "$containerName") # Get the container startup status isRunning=$(docker inspect -f "{{.State.Running}}" "$containerName") if [[ "$isRunning" == "true" ]]; then echo "Container: $containerName - IP: $dockerIp - Started successfully" fi cluster.sh script file #!/usr/bin/env bash set -e # Script current directory cPath=$(cd $(dirname "$0") || exit; pwd) # Start the cluster number num="$1" if [[ ! "$num" ]]; then num=6 fi sPort=6378 for((i=1;i<=$num;i++)); do sh ${cPath}/run.sh $(($sPort+$i)) done Start the service Execute the script file and create 6 nodes by default sh scripts/cluster.sh Script returns results
Run docker ps to check if the startup is successful. root@DESKTOP-Q13EI52:~/docker-config/redis# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0601df1a456 redis "docker-entrypoint.s..." 27 seconds ago Up 26 seconds 0.0.0.0:6384->6379/tcp redis_6384 6fecf70465b8 redis "docker-entrypoint.s..." 27 seconds ago Up 26 seconds 0.0.0.0:6383->6379/tcp redis_6383 1af15e90b7a0 redis "docker-entrypoint.s..." 28 seconds ago Up 27 seconds 0.0.0.0:6382->6379/tcp redis_6382 6c495f31a5df redis "docker-entrypoint.s..." 28 seconds ago Up 28 seconds 0.0.0.0:6381->6379/tcp redis_6381 e54fd9fd0550 redis "docker-entrypoint.s..." 29 seconds ago Up 28 seconds 0.0.0.0:6380->6379/tcp redis_6380 be92ad2f7046 redis "docker-entrypoint.s..." 29 seconds ago Up 29 seconds 0.0.0.0:6379->6379/tcp redis_6379 So far, six independent cluster nodes have been created, but they are not working properly yet. Creating a cluster You can skip this part, I just want to save trouble Get the IP addresses of all containers started by the container redis_ docker inspect -f "{{.NetworkSettings.IPAddress}}:6379" `docker ps | grep redis_ | awk -F' ' '{print $1}'` | sort |xargs | sed 's/ /, /g' # Return result# 172.17.0.2:6379, 172.17.0.3:6379, 172.17.0.4:6379, 172.17.0.5:6379, 172.17.0.6:6379, 172.17.0.7:6379 Initial cluster creation execution ./redis-cli --cluster create 172.17.0.2:6379, 172.17.0.3:6379, 172.17.0.4:6379, 172.17.0.5:6379, 172.17.0.6:6379, 172.17.0.7:6379 --cluster-replicas 1 Output licas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.17.0.6:6379 to 172.17.0.2:6379 Adding replica 172.17.0.7:6379 to 172.17.0.3:6379 Adding replica 172.17.0.5:6379 to 172.17.0.4:6379 M: e8da1fef656984de3ec2a677edc8d9c48d01cd95 172.17.0.2:6379 slots:[0-5460] (5461 slots) master M: 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 172.17.0.3:6379 slots:[5461-10922] (5462 slots) master M: 0a46ab2f6d176738b55fe699c2df1c34f8200d06 172.17.0.4:6379 slots:[10923-16383] (5461 slots) master S: bd3064ad5297dfc258e9236943455c589be8b2a3 172.17.0.5:6379 replicates 0a46ab2f6d176738b55fe699c2df1c34f8200d06 S: f1d8c897882d29e6538b1158525493b3b782289a 172.17.0.6:6379 replicates e8da1fef656984de3ec2a677edc8d9c48d01cd95 S: 619e1cb52f39e07b321719b77fc3631fa6293cef 172.17.0.7:6379 replicates 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 Can I set the above configuration? (type 'yes' to accept): Input: yes, the slots will be evenly distributed >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ..... >>> Performing Cluster Check (using node 172.17.0.2:6379) M: e8da1fef656984de3ec2a677edc8d9c48d01cd95 172.17.0.2:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: f1d8c897882d29e6538b1158525493b3b782289a 172.17.0.6:6379 slots: (0 slots) slave replicates e8da1fef656984de3ec2a677edc8d9c48d01cd95 S: bd3064ad5297dfc258e9236943455c589be8b2a3 172.17.0.5:6379 slots: (0 slots) slave replicates 0a46ab2f6d176738b55fe699c2df1c34f8200d06 M: 0a46ab2f6d176738b55fe699c2df1c34f8200d06 172.17.0.4:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 619e1cb52f39e07b321719b77fc3631fa6293cef 172.17.0.7:6379 slots: (0 slots) slave replicates 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 M: 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 172.17.0.3:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. Connecting to a Cluster Connect via client redis-cli -c <port> Execute the command: 127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:104 cluster_stats_messages_pong_sent:120 cluster_stats_messages_sent:224 cluster_stats_messages_ping_received:115 cluster_stats_messages_pong_received:104 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:224 If you see: Client console: 127.0.0.1:6379> cluster help 1) CLUSTER <subcommand> arg arg ... arg. Subcommands are: 2) ADDSLOTS <slot> [slot ...] -- Assign slots to current node. 3) BUMPEPOCH -- Advance the cluster config epoch. 4) COUNT-failure-reports <node-id> -- Return number of failure reports for <node-id>. 5) COUNTKEYSINSLOT <slot> - Return the number of keys in <slot>. 6) DELSLOTS <slot> [slot ...] -- Delete slots information from current node. 7) FAILOVER [force|takeover] -- Promote current replica node to being a master. 8) FORGET <node-id> -- Remove a node from the cluster. 9) GETKEYSINSLOT <slot> <count> -- Return key names stored by current node in a slot. 10) FLUSHSLOTS -- Delete current node own slots information. 11) INFO - Return information about the cluster. 12) KEYSLOT <key> -- Return the hash slot for <key>. 13) MEET <ip> <port> [bus-port] -- Connect nodes into a working cluster. 14) MYID -- Return the node id. 15) NODES -- Return cluster configuration seen by node. Output format: 16) <id> <ip:port> <flags> <master> <pings> <pongs> <epoch> <link> <slot> ... <slot> 17) REPLICATE <node-id> -- Configure current node as replica to <node-id>. 18) RESET [hard|soft] -- Reset current node (default: soft). 19) SET-config-epoch <epoch> - Set config epoch of current node. 20) SETSLOT <slot> (importing|migrating|stable|node <node-id>) -- Set slot state. 21) REPLICAS <node-id> -- Return <node-id> replicas. 22) SAVECONFIG - Force saving cluster configuration on disk. 23) SLOTS -- Return information about slots range mappings. Each range is made of: 24) start, end, master and replicas IP addresses, ports and ids View the cluster-related commands provided by the client: Cluster Manager Commands: create host1:port1 ... hostN:portN --cluster-replicas <arg> check host:port --cluster-search-multiple-owners info host:port fix host:port --cluster-search-multiple-owners reshard host:port --cluster-from <arg> --cluster-to <arg> --cluster-slots <arg> --cluster-yes --cluster-timeout <arg> --cluster-pipeline <arg> --cluster-replace rebalance host:port --cluster-weight <node1=w1...nodeN=wN> --cluster-use-empty-masters --cluster-timeout <arg> --cluster-simulate --cluster-pipeline <arg> --cluster-threshold <arg> --cluster-replace add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> del-node host:port node_id call host:port command arg arg .. arg set-timeout host:port milliseconds import host:port --cluster-from <arg> --cluster-copy --cluster-replace This is the end of this article about how to quickly build a Redis cluster with Docker. For more information about building a Redis cluster with Docker, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope you will support 123WORDPRESS.COM in the future! You may also be interested in:
|
<<: Summary of several common ways to abbreviate javascript code
>>: A simple and effective solution to forget the initial password when installing MySQL
Two major categories of indexes Storage engine us...
Installation Steps 1. Create a virtual machine 2....
123WORDPRESS.COM has explained to you the install...
Navicat reports errors 10060 and 1045 when connec...
1. What is event delegation? Event delegation: Ut...
For example, when you create a new table or updat...
Layout part: <div id="slider"> &l...
1. Introduction to TypeScript The previous articl...
Preface JavaScript continues to grow and prosper ...
ab command principle Apache's ab command simu...
Table of contents 1. Synchronization Principle 2....
Table of contents 1. What are options? 2. What at...
Table of contents 1. Introduction: 2. The first i...
The machines in our LAN can access the external n...
Table of contents 1. Some concepts of Tomcat –1, ...