Last active
March 19, 2024 08:53
-
-
Save vadirajks/9161c9e70b1a109aa6a7243c8fbc6f81 to your computer and use it in GitHub Desktop.
redis cluster setup using bash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Get the hostname | |
host=$(hostname -i) | |
# Set the input variable based on the hostname | |
if [[ $host == *"172.16.25.137"* ]]; then | |
input="m1=172.16.25.137:8001, s-m2=172.16.25.138:7001, s-m3=172.16.25.139:6001" | |
elif [[ $host == *"172.16.25.138"* ]]; then | |
input="m2=172.16.25.138:8002, s-m1=172.16.25.137:7002, s-m3=172.16.25.139:6002" | |
elif [[ $host == *"172.16.25.139"* ]]; then | |
input="m3=172.16.25.139:8003, s-m1=172.16.25.137:7003, s-m2=172.16.25.138:6003" | |
else | |
echo "Unknown hostname. Exiting." | |
exit 1 | |
fi | |
# Path to the Redis server binary | |
REDIS_SERVER="/usr/bin/redis-server" | |
# Function to create Redis configuration files | |
create_redis_config() { | |
local port=$1 | |
local folder=$2 | |
sudo mkdir -p "/etc/redis/cluster/${folder}" "/var/log/redis/cluster/${folder}" "/var/run/redis/cluster/${folder}" "/var/lib/redis/cluster/${folder}" | |
sudo chown -R redis:redis "/etc/redis/cluster/${folder}" "/var/log/redis/cluster/${folder}" "/var/run/redis/cluster/${folder}" "/var/lib/redis/cluster/${folder}" /etc/redis/cluster /var/log/redis/cluster /var/run/redis/cluster /var/lib/redis/cluster | |
cat <<EOL | sudo tee "/etc/redis/cluster/${folder}/${folder}.conf" > /dev/null | |
port ${port} | |
dir /var/lib/redis/cluster/${folder}/ | |
appendonly no | |
protected-mode no | |
cluster-enabled yes | |
cluster-config-file nodes_${folder}.conf | |
cluster-node-timeout 5000 | |
pidfile /var/run/redis/cluster/${folder}/${folder}.pid | |
logfile /var/log/redis/cluster/${folder}/${folder}.log | |
loglevel notice | |
dbfilename dump-${port}-${folder}.rdb | |
EOL | |
sudo chmod 755 "/etc/redis/cluster/${folder}" | |
sudo chmod 644 "/etc/redis/cluster/${folder}/${folder}.conf" | |
cat <<EOL | sudo tee "/etc/systemd/system/${folder}.service" > /dev/null | |
[Unit] | |
Description=Redis key-value database on port ${port} | |
After=network.target | |
After=network-online.target | |
Wants=network-online.target | |
Documentation=http://redis.io/documentation, man:redis-server(1) | |
[Service] | |
ExecStart=${REDIS_SERVER} /etc/redis/cluster/${folder}/${folder}.conf --supervised systemd | |
ExecStop=${REDIS_SERVER}-cli -h 127.0.0.1 -p ${port} shutdown | |
Type=notify | |
User=redis | |
Group=redis | |
RuntimeDirectory=redis | |
RuntimeDirectoryMode=0755 | |
LimitNOFILE=65535 | |
[Install] | |
WantedBy=multi-user.target | |
EOL | |
} | |
# Check if Redis server binary exists | |
if [ ! -f "$REDIS_SERVER" ]; then | |
echo "Redis is not installed. Installing Redis..." | |
sudo yum install redis -y | |
if [ $? -ne 0 ]; then | |
echo "Failed to install Redis. Exiting." | |
exit 1 | |
fi | |
fi | |
# Create directories and configuration files for Redis instances | |
IFS=", " read -r -a instances <<< "$input" | |
for instance in "${instances[@]}"; do | |
instance_info=(${instance//=/ }) | |
role=${instance_info[0]} | |
host_port=${instance_info[1]} | |
host=${host_port%:*} | |
port=${host_port#*:} | |
folder="redis-server-${role}" | |
create_redis_config "$port" "$folder" | |
done | |
# Start and enable Redis instances | |
for folder in /etc/redis/cluster/*; do | |
service_name=$(basename "$folder") | |
systemctl daemon-reload | |
sleep 2 | |
systemctl enable "${service_name}.service" | |
systemctl restart "${service_name}.service" | |
echo "Redis instance ${service_name} started and configured as a systemd service." | |
done |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Create Redis cluster | |
redis-cli --cluster create 172.16.25.137:8001 172.16.25.138:8002 172.16.25.139:8003 | |
sleep 10 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Function to execute Redis CLI commands on a given host and port | |
execute_redis_command() { | |
local host=$1 | |
local port=$2 | |
local command="$3" | |
redis-cli -h "$host" -p "$port" <<< "$command" | |
} | |
# Set up replication from slave nodes to their respective master nodes | |
input="m1=172.16.25.137:8001, s-m2=172.16.25.138:8002/7001, s-m3=172.16.25.139:8003/6001 | |
m2=172.16.25.138:8002, s-m1=172.16.25.137:8001/7002, s-m3=172.16.25.139:8003/6002 | |
m3=172.16.25.139:8003, s-m1=172.16.25.137:8001/7003, s-m2=172.16.25.138:8002/6003" | |
# Iterate over each line in the input | |
IFS=$'\n' read -r -d '' -a lines <<< "$input" | |
for line in "${lines[@]}"; do | |
connect_ip=$(echo "${line}"|awk -F, '{print $1}' | awk -F= '{print $2}' | awk -F: '{print $1}') | |
# Split the line into master and slave nodes | |
IFS=", " read -r -a instances <<< "$line" | |
for instance in "${instances[@]}"; do | |
instance_info=(${instance//=/ }) | |
role=${instance_info[0]} | |
host_port=${instance_info[1]} | |
host=${host_port%:*} | |
port=${host_port#*:} | |
# If the role is a slave, set up replication | |
if [[ $role == s-* ]]; then | |
master_role=${role#s-} | |
master_ip=${host} | |
master_port=${port%/*} | |
slave_ip=${connect_ip} | |
slave_port=${port#*/} | |
# Check if replication is already set up | |
master_node_id=$(execute_redis_command "$master_ip" "$master_port" "CLUSTER NODES" | grep "$master_ip:$master_port" | grep "master" | awk '{print $1}') | |
if ! execute_redis_command "$slave_ip" "$slave_port" "CLUSTER NODES" | grep -q "$master_node_id"; then | |
execute_redis_command "$slave_ip" "$slave_port" "CLUSTER MEET $master_ip $master_port" | |
sleep 5 | |
master_node_id=$(execute_redis_command "$host" "$master_port" "CLUSTER NODES" | grep ":${master_port}" | grep "master" | awk '{print $1}') | |
execute_redis_command "$slave_ip" "$slave_port" "CLUSTER REPLICATE $master_node_id" | |
sleep 10 | |
else | |
echo "Replication from $master_ip:$master_port already set up on $slave_ip:$slave_port." | |
fi | |
fi | |
done | |
done |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
master_port_start_from=7000 | |
slave_port_start_from=8000 | |
# Path to the Redis server binary | |
REDIS_SERVER="/usr/bin/redis-server" | |
# Function to execute Redis CLI commands on a given port | |
execute_redis_command() { | |
local port=$1 | |
shift | |
local command="$@" | |
redis-cli -h 127.0.0.1 -p "$port" <<< "$command" | |
} | |
# Function to create Redis configuration files | |
create_redis_config() { | |
local port=$1 | |
local folder=$2 | |
sudo mkdir -p "/etc/redis/cluster/${folder}" "/var/log/redis/cluster/${folder}" "/var/run/redis/cluster/${folder}" "/var/lib/redis/cluster/${folder}" | |
sudo chown -R redis:redis "/etc/redis/cluster/${folder}" "/var/log/redis/cluster/${folder}" "/var/run/redis/cluster/${folder}" "/var/lib/redis/cluster/${folder}" /etc/redis/cluster /var/log/redis/cluster /var/run/redis/cluster /var/lib/redis/cluster | |
cat <<EOL | sudo tee "/etc/redis/cluster/${folder}/${folder}.conf" > /dev/null | |
port ${port} | |
dir /var/lib/redis/cluster/${folder}/ | |
appendonly no | |
protected-mode no | |
cluster-enabled yes | |
cluster-config-file nodes_${folder}.conf | |
cluster-node-timeout 5000 | |
pidfile /var/run/redis/cluster/${folder}/${folder}.pid | |
logfile /var/log/redis/cluster/${folder}/${folder}.log | |
loglevel notice | |
dbfilename dump-${port}-${folder: -1}.rdb | |
EOL | |
sudo chmod 755 "/etc/redis/cluster/${folder}" | |
sudo chmod 644 "/etc/redis/cluster/${folder}/${folder}.conf" | |
cat <<EOL | sudo tee "/etc/systemd/system/${folder}.service" > /dev/null | |
[Unit] | |
Description=Redis key-value database on port ${port} | |
After=network.target | |
After=network-online.target | |
Wants=network-online.target | |
Documentation=http://redis.io/documentation, man:redis-server(1) | |
[Service] | |
ExecStart=${REDIS_SERVER} /etc/redis/cluster/${folder}/${folder}.conf --supervised systemd | |
ExecStop=${REDIS_SERVER}-cli -h 127.0.0.1 -p ${port} shutdown | |
Type=notify | |
User=redis | |
Group=redis | |
RuntimeDirectory=redis | |
RuntimeDirectoryMode=0755 | |
LimitNOFILE=65535 | |
[Install] | |
WantedBy=multi-user.target | |
EOL | |
} | |
# Check if Redis server binary exists | |
if [ ! -f "$REDIS_SERVER" ]; then | |
echo "Redis is not installed. Installing Redis..." | |
sudo yum install redis -y | |
if [ $? -ne 0 ]; then | |
echo "Failed to install Redis. Exiting." | |
exit 1 | |
fi | |
fi | |
# Create directories and configuration files for Redis instances | |
for ((i = 0; i < 3; i++)); do | |
# Master Redis instances | |
master_port=$((master_port_start_from + i + 1)) | |
folder="redis-server-${master_port}-m$((i+1))" | |
create_redis_config "$master_port" "$folder" | |
# Slave Redis instances | |
slave_port=$((slave_port_start_from + i + 1)) | |
folder="redis-server-${slave_port}-s$((i+1))" | |
create_redis_config "$slave_port" "$folder" | |
done | |
# Start and enable Redis instances | |
for folder in /etc/redis/cluster/*; do | |
#service_name=$(basename "$folder" | sed 's|redis-server-||') | |
service_name=$(basename "$folder") | |
systemctl daemon-reload | |
sleep 2 | |
systemctl enable "${service_name}.service" | |
systemctl restart "${service_name}.service" | |
echo "Redis instance ${service_name} started and configured as a systemd service." | |
done | |
# Create Redis cluster | |
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 | |
sleep 10 | |
# Meet master nodes and set up replication | |
for ((i = 0; i < 3; i++)); do | |
master_port=$((master_port_start_from + i + 1)) | |
slave_port=$((slave_port_start_from + i + 1)) | |
#master_node_id=$(execute_redis_command "$master_port" "CLUSTER NODES" | awk -v port="$master_port" '$2 == port && $3 == "master" {print $1}') | |
master_node_id=$(execute_redis_command "$master_port" "CLUSTER NODES" | grep ":${master_port}" | grep "master" | awk '{print $1}') | |
# Meet the existing master node | |
redis-cli -h 127.0.0.1 -p "$slave_port" CLUSTER MEET 127.0.0.1 "$master_port" | |
sleep 5 | |
# Replicate from the master node | |
execute_redis_command "$slave_port" "CLUSTER REPLICATE $master_node_id" | |
sleep 10 | |
done | |
echo "Redis cluster setup completed." |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Stop all Redis services | |
for service in $(systemctl list-unit-files | grep redis-server | awk '{print $1}'); do | |
sudo systemctl stop "$service" | |
done | |
# Disable and delete all Redis services | |
for service in $(ls /etc/systemd/system/ | grep redis-server); do | |
sudo systemctl disable "$service" | |
sudo rm -f "/etc/systemd/system/$service" | |
done | |
# Delete Redis configuration files and directories | |
sudo rm -rf /etc/redis/cluster /var/log/redis/cluster /var/run/redis/cluster /var/lib/redis/cluster | |
echo "Rollback completed. All Redis files and services have been deleted." |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Define the list of IP addresses and ports | |
IP_PORTS=( | |
"172.16.25.137:8001" | |
"172.16.25.137:7001" | |
"172.16.25.137:6001" | |
"172.16.25.137:18001" | |
"172.16.25.137:17001" | |
"172.16.25.137:16001" | |
"172.16.25.138:8002" | |
"172.16.25.138:7002" | |
"172.16.25.138:6002" | |
"172.16.25.138:18002" | |
"172.16.25.138:17002" | |
"172.16.25.138:16002" | |
"172.16.25.139:8003" | |
"172.16.25.139:7003" | |
"172.16.25.139:6003" | |
"172.16.25.139:18003" | |
"172.16.25.139:17003" | |
"172.16.25.139:16003" | |
) | |
# Check if Telnet is installed | |
if ! command -v telnet &> /dev/null; then | |
echo "Telnet is not installed. Please install telnet and try again." | |
exit 1 | |
fi | |
# Function to test Telnet connection | |
test_telnet() { | |
local host=$1 | |
local port=$2 | |
echo "Trying to connect to $host:$port..." | |
if telnet $host $port < /dev/null 2>&1 | grep -q "Connected"; then | |
echo "Connection successful to $host:$port!" | |
return 0 | |
else | |
echo "Connection failed to $host:$port!" | |
return 1 | |
fi | |
} | |
# Loop through each IP and port combination | |
for ip_port in "${IP_PORTS[@]}"; do | |
ip=$(echo "$ip_port" | cut -d':' -f1) | |
port=$(echo "$ip_port" | cut -d':' -f2) | |
# Call the function to test Telnet | |
test_telnet $ip $port | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment