Skip to content

Instantly share code, notes, and snippets.

@vadirajks
Last active March 19, 2024 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vadirajks/9161c9e70b1a109aa6a7243c8fbc6f81 to your computer and use it in GitHub Desktop.
Save vadirajks/9161c9e70b1a109aa6a7243c8fbc6f81 to your computer and use it in GitHub Desktop.
redis cluster setup using bash
#!/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
# Create Redis cluster
redis-cli --cluster create 172.16.25.137:8001 172.16.25.138:8002 172.16.25.139:8003
sleep 10
#!/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
#!/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."
#!/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."
#!/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