1. 安装说明
采用2台Linux虚拟机安装了一个最小化的企业版Jumpserver高可用环境。尽量不依赖其他组件,主机故障时能够自动切换到备机。
MySQL 主主复制,Redis 主从复制,共享目录使用rsync定时同步,keepalived虚拟出VIP对外提供服务。
角色 | 主机名 | IP | VIP | 安装组件 | 系统 | 共享目录 |
---|---|---|---|---|---|---|
jumpserver主机 | jms01 | 192.168.8.200 | 192.168.8.205 | MySQL 8.0.41 主Redis 6.2.17 主 | Redhat 9 | /data |
jumpserver备机 | jms02 | 192.168.8.201 | MySQL 8.0.41 主Redis 6.2.17 主 | /data |
2. 安装步骤
2.1 Rsync同步配置
两个节点都安装sync 和 配置ssh密钥同步
bash
# 安装sync
yum install rsync -y
mkdir /data
chmod 777 -R /data
# 配置ssh 密钥同步
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@jms01
ssh-copy-id root@jms02
两个节点都配置数据同步:
bash
# jms01 上创建同步脚本 sync_to_jms02.sh
[root@jms01 ~]# more sync_to_jms02.sh
#!/bin/bash
rsync -avz /data/ root@jms02:/data/
# jms02 上创建同步脚本 sync_to_jms01.sh
[root@jms02 ~]# more sync_to_jms01.sh
#!/bin/bash
rsync -avz /data/ root@jms01:/data/
配置计划任务:
bash
[root@jms02 ~]# crontab -e
* * * * * /root/sync_to_jms01.sh
[root@jms01 ~]# crontab -e
* * * * * /root/sync_to_jms02.sh
2.2 MySQL集群配置
2.2.1 安装MySQL
执行命令安装mysql:yum install mysql-server.x86_64
修改mysql配置文件:/etc/my.cnf.d/mysql-server.cnf
,改完后启动数据库systemctl enable mysqld --now
javascript
[root@jms02 ~]# more /etc/my.cnf.d/mysql-server.cnf
[client]
default-character-set = utf8mb4
[mysqld]
server-id=2 # jms01 填写1,jms02 填写2
port=3306
lower_case_table_names=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
long_query_time=2
slow_query_log_file=/var/log/mysql/mysqld_slowlog.log
slow_query_log=1
log-queries-not-using-indexes=off
max_connections=1000
max_connect_errors=6000
thread_cache_size=32
group_concat_max_len=102400
skip_ssl
explicit_defaults_for_timestamp=true
table_open_cache=614
external-locking=FALSE
sort_buffer_size=2M
join_buffer_size=2M
read_buffer_size=1M
thread_cache_size=300
tmp_table_size=256M
max_heap_table_size=256M
myisam_sort_buffer_size=128M
myisam_max_sort_file_size=10G
innodb_buffer_pool_size=2048M
innodb_thread_concurrency=4
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=16M
innodb_log_file_size=128M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
innodb_file_per_table=0
log-bin=mysql-bin
binlog-format=Row
binlog_cache_size=4M
max_binlog_cache_size=512M
max_binlog_size=512M
# bin log 保留时间
expire_logs_days=7
binlog-ignore-db=mysql,performance_schema,information_schema
2.2.2 创建数据库账号
创建mysql复制用的账号:
sql
CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'YourPassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
创建jumpserver数据库和访问账号:
sql
create database jumpserver default charset 'utf8';
create user 'jumpserver'@'%' identified by 'YourPassword';
grant all on jumpserver.* to 'jumpserver'@'%';
flush privileges;
2.2.3 设置主从复制
jms01上执行 show master status;
然后记录下File 和 Position,然后到jms02上去执行复制命令:
bash
CHANGE MASTER TO MASTER_HOST='jms01',MASTER_USER='repl',MASTER_PASSWORD='YourPassword',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=157;
start slave;
jms02上执行 show master status;
然后记录下File 和 Position,然后到jms01上去执行复制命令:
bash
CHANGE MASTER TO MASTER_HOST='jms02',MASTER_USER='repl',MASTER_PASSWORD='YourPassword',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=157;
start slave;
检查复制状态:show slave status \G;
,如果Slave_IO_Running和Slave_SQL_Running都是Yes
代表复制OK
sql
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
。。。。。。
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
。。。。。。
mysql>
2.3 Redis 主从
2.3.1 安装Redis
两台机分别安装Redis程序,替换配置文件
sql
yum -y install epel-release https://repo.ius.io/ius-release-el7.rpm
yum install -y redis6
sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis/redis.conf
sed -i "561i maxmemory-policy allkeys-lru" /etc/redis/redis.conf
sed -i "481i requirepass YourPassword" /etc/redis/redis.conf
sed -i '$a masterauth YourPassword' /etc/redis/redis.conf
备机配置文件增加以下内容:
sql
replicaof jms01 6379
2.3.2 设置主从
主从机直接启动Redis服务,Redis会自动完成主从同步。systemctl enable redis --now
检查同步状态:redis-cli -a YourPassword -p 6379 info replication
bash
[root@jms01 ~]# redis-cli -a YourPassword -p 6379 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.8.201,port=6379,state=online,offset=11183439,lag=1
master_failover_state:no-failover
master_replid:23cf2ba3cf8681e5f1a6aa84b0f888e0c53fd84d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:11185418
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:10136843
repl_backlog_histlen:1048576
[root@jms02 ~]# redis-cli -a YourPassword -p 6379 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:jms01
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:11185418
slave_repl_offset:11185418
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:23cf2ba3cf8681e5f1a6aa84b0f888e0c53fd84d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:11185418
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:10136843
repl_backlog_histlen:1048576
[root@jms02 ~]#
2.3.3 主从切换脚本
Keepalived切换IP的时候需要把redis的状态切换过去。
markdown
将当前节点切换为从
redis-cli -a YourPassword -p 6379 slaveof 192.168.7.102 6379
切换为主
redis-cli -a YourPassword -p 6379 SLAVEOF NO ONE
查看主从同步状态
redis-cli -a YourPassword -p 6379 info replication
2.4 Keepalived 配置
2.4.1 安装Keepalived
两台机分别执行yum install -y keepalived.x86_64
修改配置文件:
python
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
script_user root
}
vrrp_script checkredis
{
script "/root/check_port_listen.sh 6379"
interval 3
weight -20
}
vrrp_instance VI_1 {
state MASTER # 200是MASTER、201为BACKUP
interface ens192 # 网卡名称
virtual_router_id 11
priority 90 # 主机大于备机,200 是110,201 是100
advert_int 1
authentication {
auth_type PASS
auth_pass YourPassword
}
virtual_ipaddress { 192.168.8.205 }
track_script
{
checkredis
}
notify_master "/root/redis_master.sh"
notify_backup "/root/redis_slave.sh"
}
EOF
2.4.2 准备Redis切换脚本
/root/redis_master.sh:本机变为master的时候执行这个脚本(将本机的Redis变为master) /root/redis_slave.sh:本机变为slave的时候执行这个脚本(将本机的Redis变为slave)
编辑/root/redis_master.sh
文件:
bash
cat > /root/redis_master.sh << EOF
#!/bin/bash
LOG=/var/log/redis_switch.log
date >> $LOG
echo ">> Switching to MASTER <<" >> $LOG
# 切换为主节点
/usr/bin/redis-cli -a YourPassword -p 6379 SLAVEOF NO ONE >> $LOG 2>&1
if [[ $? -eq 0 ]]; then
echo "Redis successfully switched to MASTER." >> $LOG
else
echo "Failed to switch Redis to MASTER." >> $LOG
exit 1
fi
echo ">> MASTER switch complete <<" >> $LOG
exit 0
EOF
编辑/root/redis_slave.sh
文件:
bash
cat > /root/redis_slave.sh << EOF
#!/bin/bash
LOG=/data/paraview/esc/log/redis_switch.log
MASTER_IP="jms01" # 这里互相写对方的IP地址
date >> $LOG
echo ">> Switching to SLAVE <<" >> $LOG
# 切换为从节点
/usr/bin/redis-cli -a YourPassword -p 6379 slaveof $MASTER_IP 6379 >> $LOG 2>&1
if [[ $? -eq 0 ]]; then
echo "Redis successfully switched to SLAVE of $MASTER_IP." >> $LOG
else
echo "Failed to switch Redis to SLAVE." >> $LOG
exit 1
fi
echo ">> SLAVE switch complete <<" >> $LOG
exit 0
EOF
编辑/root/check_port_listen.sh
文件:
bash
cat > /root/check_port_listen.sh << EOF
#!/bin/sh
PORT=$1
pro_count=`netstat -na | grep ":$PORT " | grep LISTEN | wc -l`
if [ "$pro_count"z != "0"z ];then
exit 0
else
exit 1
fi
EOF
2.4.3 VIP切换测试
执行systemctl enable keepalived.service --now
启动keepalived,然后执行ip a s | grep 192.168.8
查看VIP的位置
bash
[root@jms01 ~]# ip a s | grep 192.168.8
inet 192.168.8.200/19 brd 192.168.31.255 scope global noprefixroute ens192
inet 192.168.8.205/32 scope global ens192
[root@jms02 ~]# ip a s | grep 192.168.8
inet 192.168.8.201/19 brd 192.168.31.255 scope global noprefixroute ens192
停止主机的keepalived,可以看到VIP地址切换到了备机,同时备机的Redis状态变为了master
2.5 安装Jumpserver
2.5.1 准备安装包
上传安装包到主备机,解压然后修改配置文件config-example.txt
。
shell
VOLUME_DIR=/data/jumpserver
SECRET_KEY=kWQdmdCQKjaWlHYpPhkNQDkfaRulM6YnHctsHLlSPs8287o2kW # 要其他 JumpServer 服务器一致 (*)
BOOTSTRAP_TOKEN=YourPassword # 要其他 JumpServer 服务器一致 (*)
SESSION_EXPIRE_AT_BROWSER_CLOSE=True # 关闭浏览器 session 过期
DB_HOST=192.168.8.200 # 可以填写各自的地址,也可以是VIP的地址
DB_PORT=3306
DB_USER=jumpserver
DB_PASSWORD=YourPassword
DB_NAME=jumpserver
REDIS_HOST=192.168.8.205 # 填写VIP的地址
REDIS_PORT=6379
REDIS_PASSWORD=YourPassword
SHARE_ROOM_TYPE=redis # KoKo Lion 使用 redis 共享
REUSE_CONNECTION=False # Koko 禁用连接复用
2.5.2 安装jumpserver
先在主机上执行命令./jmsctl.sh install
开始安装jumpserver
bash
./jmsctl.sh install
=============其他选项都默认=============
3. 配置持久化目录
是否需要自定义持久化存储, 默认将使用目录 /data/jumpserver? (y/n) (默认为 n): n
完成
4. 配置 MySQL
是否使用外部 MySQL? (y/n) (默认为 n): y
请输入 MySQL 的主机地址 (无默认值): 192.168.8.200
请输入 MySQL 的端口 (默认为3306): 3306
请输入 MySQL 的数据库(事先做好授权) (默认为jumpserver): jumpserver
请输入 MySQL 的用户名 (无默认值): jumpserver
请输入 MySQL 的密码 (无默认值): YourPassword
完成
5. 配置 Redis
是否使用外部 Redis? (y/n) (默认为 n): y
请输入 Redis 的主机地址 (无默认值): 192.168.8.205 # VIP的地址
请输入 Redis 的端口 (默认为6379): 6379
请输入 Redis 的密码 (无默认值): YourPassword
完成
=============其他选项都默认=============
执行命令jmsctl start
启动jumpserver,然后通过浏览器访问http://jms02/, 访问成功后,使用相同的方式安装备机。
2.5.3 测试主备机切换
分别从主备机添加资产,然后从主备机分别访问被管资产,可以看到配置数据和录屏数据都可以从主备机上正常查看。其中录屏文件位置:/data/jumpserver/core/data/media/replay/
bash
[root@jms01 ~]# tree /data/jumpserver/core/data/media/replay/
/data/jumpserver/core/data/media/replay/
└── 2025-04-08
├── 1954c0c6-fa6a-4bc2-b810-9e5eebda50da.cast.gz
├── 21cb998a-7818-4fcd-912c-9a15071757d8.cast.gz
├── 23bcbe5d-2c98-4e19-9cad-f78588ba9ca9.cast.gz
├── 2e618b21-9236-4145-859b-7f2f10d4836a.cast.gz
└── 738c94da-2e7e-4fdb-b68a-9cecadf0f36a.cast.gz
[root@jms02 ~]# tree /data/jumpserver/core/data/media/replay/
/data/jumpserver/core/data/media/replay/
└── 2025-04-08
├── 1954c0c6-fa6a-4bc2-b810-9e5eebda50da.cast.gz
├── 21cb998a-7818-4fcd-912c-9a15071757d8.cast.gz
├── 23bcbe5d-2c98-4e19-9cad-f78588ba9ca9.cast.gz
├── 2e618b21-9236-4145-859b-7f2f10d4836a.cast.gz
└── 738c94da-2e7e-4fdb-b68a-9cecadf0f36a.cast.gz
后续将继续记录发布机的安装步骤以及注意事项。
本文由博客一文多发平台 OpenWrite 发布!