使用 upstream 进行集群管理
upstream serviceGroup{
server 127.0.0.1:9090;
server xxxxx:9090;
server xxxx:9090;
}
server{
xxxx
...
location /api {
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://serviceGroup;
}
}
1、redis 一台机器最少两个节点,一主一从,3台机器组成3主3从
2、以宝塔为例子:宝塔安装redis后,进入安装目录 /www/server/redis
3、安装文件夹 clusters
进入后分别创建对应节点文件夹,如:1101
1102
两个端口实例文件夹,每个文件夹中创建 redis.conf
文件
bind 0.0.0.0
# 修改对应文件夹的端口号
port 1101
daemonize yes
requirepass "12345"
logfile "./redis.log"
dbfilename "dupm.rdb"
dir "/www/server/redis/clusters/1101"
masterauth "12345"
# 是否开启集群
cluster-enabled yes
# 生成的node文件,记录集群节点信息,默认为nodes.conf,会自动生成
cluster-config-file nodes.conf
#节点连接超时时间
cluster-node-timeout 15000
#对外的ip
cluster-announce-ip xx.xxx.xxx.xxx 公网地址
#集群节点映射端口
cluster-announce-port 1101
#集群节点总线端口,节点之间互相通信,常规端口+1万,用port + 10000
cluster-announce-bus-port 11101
在 1101 和 1102 下面都分别创建这个文件,内容一样 就修改端口,其他服务器也直接复制
4、分别启动这两个实例
./src/redis-server ./clusters/1101/redis.conf
./src/redis-server ./clusters/1102/redis.conf
5、启动后查询是否启动成功
ps -aux | grep redis
6、检查所有机器都启动成功后,选择其中一台创建集群,内网和公网IP都行
./src/redis-cli -a 12345 -p 1101 --cluster-replicas 1 --cluster create 机器IP:1101 机器IP:1102 机器IP:1101 机器IP:1102 机器IP:1101 机器IP:1102
8、开放端口
firewall-cmd --zone=public --add-port=1101/tcp --permanent
firewall-cmd --zone=public --add-port=1102/tcp --permanent
firewall-cmd --zone=public --add-port=11101/tcp --permanent
firewall-cmd --zone=public --add-port=11102/tcp --permanent
#重新加载防火墙设置,使配置生效
firewall-cmd --reload
快速启动停止脚本:
start-redis-node.sh
#!/bin/bash
cd /www/server/redis
./src/redis-server ./clusters/1101/redis.conf
./src/redis-server ./clusters/1102/redis.conf
exit
stop-redis-node.sh
#!/bin/bash
PORT=($1 $2)
for port in ${PORT[@]}
do
PID=$(netstat -ntulp | grep :$port | awk '{print $7}' | awk -F"/" '{print $1}')
if [ $? -eq 0 ]; then
echo "process id: $PID"
else
echo "process process not exist"
exit
fi
kill -9 ${PID}
if [ $? -eq 0 ]; then
echo "kill $port success"
else
echo "kill $port fail"
fi
done
9、验证
随便找个节点进入
./src/redis-cli -c -p 1101
127.0.0.1:1101> auth 123456
OK
# 查看集群状态
127.0.0.1:1101> cluster info
# 查看集群节点
127.0.0.1:1101> cluster nodes
1、配置mysql读写分离和redis 集群
spring:
shardingsphere:
datasource:
names: master,slave
master:
# 数据库连接池类名称
type: com.zaxxer.hikari.HikariDataSource
# 数据库驱动类名
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://xxxx:3306/service?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
slave:
# 数据库连接池类名称
type: com.zaxxer.hikari.HikariDataSource
# 数据库驱动类名
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://xxxx:3306/service?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
# 规则配置
rules:
readwrite-splitting:
load-balancers:
ms:
type: ROUND_ROBIN
props:
workId: 1
data-sources:
ms:
type: Static
load-balancer-name: round-robin
props:
write-data-source-name: master
read-data-source-names: slave
# 属性配置
props:
# 展示修改以后的sql语句
sql-show: false
redis:
password: 123456 # Redis 服务器连接密码(默认为空)
timeout: 3000ms # 连接超时时间(毫秒)
jedis:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
cluster:
nodes: # Redis 集群节点地址和端口
- 192.168.0.200:1101
- 192.168.0.200:1102
- 192.168.0.201:1101
- 192.168.0.201:1102
- 192.168.0.202:1101
- 192.168.0.202:1102
2、读写分离事物配置
@Configuration
public class MasterDataSourceConfig {
@Primary
@Bean("masterSource")
@ConfigurationProperties(prefix = "spring.shardingsphere.datasource.master")
public DataSource dataSource() {
return new HikariDataSource();
}
@Primary
@Bean("masterTM")
public DataSourceTransactionManager transactionManager(@Qualifier("masterSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
3、 修改事务注解 @Transactional(value = “masterTM”)
@Override
@Transactional(value = "masterTM")
public void saveUserRole(SysUser user) {
user.setCreateTime(new Date());
user.setPassword(passwordEncoder.encode(user.getPassword()));
sysUserMapper.insert(user);
sysUserRoleMapper.delete(Wrappers.<SysUserRole>update().lambda().eq(SysUserRole::getUserId, user.getUserId()));
//保存用户与角色关系
saveUserRoleList(user);
}
在每台机器分别启动服务即可,在nginx upstream 中修改对应ip 端口