START SLAVE; 命令用于启动 MySQL 的主从复制功能。如果配置的时候主从,但是在同步过程中出现异常错误,则会打断主从同步,并且需要重新手动重新配置,而这个过程需要每隔一段时间监听,使用SHOW SLAVE STATUS\G; 命令来查看从服务器的复制状态,这可能就需要通过手写程序或者使用某云产品来实现。
Redis集群配置
执行编写脚本docker-redis-cluster.sh:
vim docker-redis-cluster.sh
#!/bin/bash
# 循环执行6次
for i in $(seq 6)
do
# 设置端口号
PORT=637$i
# 获取当前主机的IP地址
REDIS\_CLUSTER\_IP=$(hostname -I | awk '{print $1}')
# 设置配置文件路径
CONFIG\_FILE="/opt/software/rediscluster/conf/redis-$i.conf"
# 检查配置文件是否存在,如果存在并且是目录,则删除
if [ -d "$CONFIG\_FILE" ]; then
echo "配置文件$CONFIG\_FILE已经是一个目录,正在删除它..."
rm -rf "$CONFIG\_FILE"
fi
# 检查模板文件是否存在
if [ ! -f /opt/software/rediscluster/conf/redis.conf ]; then
echo "模板文件/opt/software/rediscluster/conf/redis.conf不存在,请确保它存在并且包含正确的占位符。"
exit 1
fi
# 通过sed命令替换模板文件中的占位符,生成实际的配置文件
sed "s/PORT/${PORT}/g;s/REDIS\_CLUSTER\_IP/${REDIS\_CLUSTER\_IP}/g;" /opt/software/rediscluster/conf/redis.conf > "$CONFIG\_FILE"
# 使用docker运行Redis容器,并挂载配置文件和数据目录
docker run -d --name redis-node-$i --restart=unless-stopped --net host --privileged=true -v /opt/software/rediscluster/node/redis-node-$i:/data -v "$CONFIG\_FILE":/etc/redis/redis.conf redis:7.2.4 redis-server /etc/redis/redis.conf
done
redis.conf配置文件
# Redis配置文件示例
# 绑定到所有网络接口
bind 0.0.0.0
# 保护模式设置为no,这样Redis就可以接受来自任何主机的连接
protected-mode no
# Redis 集群节点监听的端口
port PORT
# TCP backlog的数量,默认是1500,在高并发环境下你可能需要增加这个值。同时需要编辑sudo nano /etc/sysctl.conf文件,添加或者编辑net.core.somaxconn = 1500,在 nano 编辑器中,按 Ctrl + O(这是“O”字母,不是数字零)。这将会提示你保存文件。如果文件是第一次创建或之前没有被修改过,它会询问你文件名,此时你可以直接按 Enter 键确认使用当前的文件名。如果文件已经被修改过,它会直接保存更改。保存文件后,按 Ctrl + X。这将会退出 nano 编辑器并返回到终端。否则会出现提示 TCP 的 backlog 设置(1500)不能强制执行,因为 /proc/sys/net/core/somaxconn 的值被设置为更低的 128。/proc/sys/net/core/somaxconn 是一个内核参数,它定义了系统中每一个端口上排队的最大 TCP 连接数。sudo sysctl -p
tcp-backlog 1500
# 开启集群模式
cluster-enabled yes
# 超时时间,超时则认为master宕机,随后主备切换。单位是毫秒
cluster-node-timeout 5000
# 集群配置文件的路径,Redis 集群节点会自动创建和更新这个文件
cluster-config-file nodes-PORT.conf
#集群各节点IP地址,记得修改为你的ip地址
cluster-announce-ip REDIS\_CLUSTER\_IP
#集群节点映射端口
cluster-announce-port PORT
#集群总线端口
cluster-announce-bus-port 1PORT
# TCP 后台线程和I/O线程:如果启用了 TCP 后台线程(io-threads-do-reads)或 I/O 线程(io-threads),确保为这些线程配置了正确的 CPU 内核列表(server_cpulist、bio_cpulist 等)。
io-threads-do-reads yes
io-threads 4
# Redis Server绑定到的CPU内核列表,这里绑定到CPU 0和1
server_cpulist 0-1
# 后台I/O线程绑定到的CPU内核列表,这里绑定到CPU 2和3
bio_cpulist 2-3
# AOF重写进程绑定到的CPU内核列表,这里绑定到CPU 4
aof_rewrite_cpulist 4
# RDB持久化进程绑定到的CPU内核列表,这里绑定到CPU 5
bgsave_cpulist 5
# 启用AOF持久化
appendonly yes
# AOF文件名称
appendfilename "appendonly.aof"
# appendonly 文件同步策略,always 表示每个写命令都立即同步,everysec 表示每秒同步一次,no 表示由操作系统决定何时同步
appendfsync everysec
# 密码设置
requirepass admin
# Redis集群启用了密码验证,那么除了在每个节点的配置文件中设置requirepass之外,还需要设置masterauth
masterauth admin
# 禁用 RDB 快照持久化,因为集群模式下有节点复制功能
save ""
# 禁用 AOF 重写
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 0
配置过程
通常情况下内存overcommit(超额提交)未启用,这可能在内存不足的情况下导致后台保存或复制失败。即使在不出现内存不足的情况下,这也可能导致失败。在/etc/sysctl.conf文件中添加vm.overcommit_memory = 1,然后重启系统以启用内存overcommit。
[root@node3 rediscluster]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.core.somaxconn = 1500
sysctl vm.overcommit_memory = 1
或者执行以下命令并查看是否更改成功。
sysctl -w vm.overcommit\_memory=1
然后重启服务器,执行以下命令运行脚本:
chmod 777 /opt/software/rediscluster/conf/redis.conf
chmod 777 /opt/software/rediscluster/docker-redis-cluster.sh
sh docker-redis-cluster.sh
docker exec -it redis-node-1 bash
用私网ip:
redis-cli -a admin --cluster create 10.0.0.14:6371 10.0.0.14:6372 10.0.0.14:6373 10.0.0.14:6374 10.0.0.14:6375 10.0.0.14:6376 --cluster-replicas 1
我的Redis实例是在Docker容器内部运行的,应该使用容器内部或宿主机的私有IP地址,而不是公网IP地址。使用的是宿主机公网IP,需要确保防火墙或安全组规则允许外部连接到这些端口。
但是如果防火墙关闭了,就需要使用公网ip,否则客户端连接不上。
redis-cli -a admin --cluster create 8.138.135.85:6371 8.138.135.85:6372 8.138.135.85:6373 8.138.135.85:6374 8.138.135.85:6375 8.138.135.85:6376 --cluster-replicas 1
redis-cli -p 6371 -a admin
cluster info
cluster nodes
RocketMQ
配置runserver.sh
mkdir -p /opt/software/rocketmqcluster/bin
vi /opt/software/rocketmqcluster/bin/runserver.sh
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error\_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
find\_java\_home()
{
case "`uname`" in
Darwin)
JAVA\_HOME=$(/usr/libexec/java\_home)
;;
*)
JAVA\_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
;;
esac
}
find_java_home
[ ! -e "$JAVA\_HOME/bin/java" ] && JAVA\_HOME=$HOME/jdk/java
[ ! -e "$JAVA\_HOME/bin/java" ] && JAVA\_HOME=/usr/java
[ ! -e "$JAVA\_HOME/bin/java" ] && error_exit "Please set the JAVA\_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA\_HOME/bin/java"
export BASE\_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE\_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
calculate\_heap\_sizes()
{
case "`uname`" in
Linux)
system\_memory\_in\_mb=`free -m| sed -n '2p' | awk '{print $2}'`
system\_cpu\_cores=`egrep -c 'processor([[:space:]]+):.\*' /proc/cpuinfo`
;;
FreeBSD)
system\_memory\_in\_bytes=`sysctl hw.physmem | awk '{print $2}'`
system\_memory\_in\_mb=`expr $system\_memory\_in\_bytes / 1024 / 1024`
system\_cpu\_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
SunOS)
system\_memory\_in\_mb=`prtconf | awk '/Memory size:/ {print $3}'`
system\_cpu\_cores=`psrinfo | wc -l`
;;
Darwin)
system\_memory\_in\_bytes=`sysctl hw.memsize | awk '{print $2}'`
system\_memory\_in\_mb=`expr $system\_memory\_in\_bytes / 1024 / 1024`
system\_cpu\_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
*)
# assume reasonable defaults for e.g. a modern desktop or
# cheap server
system\_memory\_in\_mb="2048"
system\_cpu\_cores="2"
;;
esac
# some systems like the raspberry pi don't report cores, use at least 1
if [ "$system\_cpu\_cores" -lt "1" ]
then
system\_cpu\_cores="1"
fi
# set max heap size based on the following
# max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
# calculate 1/2 ram and cap to 1024MB
# calculate 1/4 ram and cap to 8192MB
# pick the max
half\_system\_memory\_in\_mb=`expr $system\_memory\_in\_mb / 2`
quarter\_system\_memory\_in\_mb=`expr $half\_system\_memory\_in\_mb / 2`
if [ "$half\_system\_memory\_in\_mb" -gt "1024" ]
then
half\_system\_m