Jumpserver双机集群搭建

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 发布!

相关推荐
杰瑞学AI8 分钟前
LeetCode详解之如何一步步优化到最佳解法:27. 移除元素
数据结构·python·算法·leetcode·面试·职场和发展
前端开发张小七27 分钟前
每日一练:3统计数组中相等且可以被整除的数对
前端·python
程序员总部28 分钟前
Python正则表达式有哪些常用匹配字符?
python·mysql·正则表达式
天天进步201534 分钟前
Python项目--基于Python的自然语言处理文本摘要系统
开发语言·python·自然语言处理
小麦果汁吨吨吨1 小时前
Flask快速入门
后端·python·flask
流云一号1 小时前
Python实现贪吃蛇三
开发语言·前端·python
小白教程1 小时前
如何处理Python爬取视频时的反爬机制?
开发语言·python·音视频·python爬虫
热爱编程的OP1 小时前
Numpy常用库方法总结
开发语言·python·numpy
cliffordl1 小时前
ReportLab 导出 PDF(文档创建)
开发语言·python·pdf
纪元A梦1 小时前
华为OD机试真题——跳格子3(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题