springboot + 读写分离+redis集群+集群部署

记录一次 集群部署springboot 项目

1、nginx

使用 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;
    }
}

2、redis

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
  • 执行后要输入一个yes 进行确认

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

3、springboot 服务

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 端口

你可能感兴趣的:(spring,boot,redis,读写分离,redis集群,集群部署)