本文主要描述:通过实现数据库读写分离,搭建高负载 o2server 集群
主机介绍
主机 | 地址 | 用途 |
application | 172.16.91.39 | o2server 应用服务器 |
mysqlmaster | 172.16.91.40 | mysql 主服务器(写) |
mysqlslave01 | 172.16.91.41 | mysql 从服务器01(读) |
mysqlslave01 | 172.16.91.42 | mysql 从服务器02(读) |
安装 mysql8
本次使用 ubuntu server 20.04 运行 apt 命令查看 ppa mysql 数据库版本
sudo apt search mysql-server

已经是最新版本的 mysql 了,后面直接安装即可,不再安装 mysql ppa 仓库.
sudo apt install mysql-server
sudo apt install mysql-server
sudo apt install mysql-server
数据库基础配置
现在对 mysql 数据库进行基础配置,不涉及主从复制,分别对 mysqlmaster,mysqlslave01,mysqlslave02 进行相同的设置,设置完成后允许远程登录.
sudo mysql_secure_installation
按提示完成设置后,进入到 myql 客户端
sudo mysql -u root -p
执行 mysql 命令,允许 root 远程登录
use mysql;
update mysql.user set host='%', plugin='mysql_native_password' where user='root';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* to root@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '1234abcd';
FLUSH PRIVILEGES;
修改 /etc/mysql/mysql.conf.d/mysqld.cnf 中的地址绑定为 0.0.0.0

重启 mysql 生效
sudo systemctl restart mysql
完成后,我们在 mysqlmaster,mysqlslave01,mysqlslave02 三台服务器上都安装了 mysql,并完成了简单的设置,允许通过 jdbc 远程链接到这三台 mysql 服务器.
本次主要完成主从环境的搭建,不考虑 mysql 的基本调优和配置.至此我们有了三台简单的 mysql 服务器,并可以用客户端链接.

mysql 主从设置:下面进行主从配置,先配置主库(master),再配置从库 slave01 和 slave02
master 配置:在 master 服务器上创建数据库 X,作为后续 o2server 使用的数据库
修改 mysql 配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf,在 mysqld 段下添加主库配置项
重启数据库服务使之生效.这里说明一下,最后的 general_log 和 general_log_file 开启了 sql 执行语句的记录,这是为了后续对读写分离进行验证而设置。再次登录到 mysql 命令行界面执行

确认 log_bin 已经开启.
执行 sql 语句创建同步使用的账户.创建一个 repl 用户,并为其简单设置管理员权限,这样可以同步一些 DDL 和 DCL 语句.
CREATE USER 'repl'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '1234abcd';
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
至此 master 服务器的配置完成了.接下来需要将 master 上的 X 数据库导出,以便导入到 slave01 和 slave02.
导出 master 数据库服务器上的 X 数据库
在 mysql 命令行界面中执行命令以锁定表.
FLUSH TABLES WITH READ LOCK;
在 master 服务器的 bash 命令行中执行数据库导出.
mysqldump -u root -p --databases X >/tmp/X.sql
查看数据库当前 log_bin 状态
show master status G

记录这里的 File: mysql-bin.000002, Position: 469,这两个参数记录了当前 master 服务器上数据库 X 修改到的日志位置,在后面的 slave 同步中需要用到,标志从这个位置开始同步,并解除数据库锁定.
UNLOCK TABLES;
slave01配置
修改 slave01 服务器上的 mysql 配置文件,在 mysqld 段下添加从库配置项
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# slave配置
server-id=2 # MySQLid 后面2个从服务器需设置不同
skip_slave_start=1 # 复制进程不会随着数据库的启动而启动,重启数据库后需手动启动,加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
read_only=1 # 从库普通账户只读;
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave-skip-errors = 1032,1062,1007
重启数据库服务使配置生效
systemctl restart mysql
进入到 slave01 数据库命令行界面执行
创建 X 数据库
create database 'X';
将从 master 导出的 X.sql 文件拷贝过来,并导入到 X 数据库
use X;
source /tmp/X.sql
至此 master 数据库和 slave01 数据库的内容一致,但是尚未开启同步.
进入到 slave01 数据库命令行界面执行同步命令使同步生效,其中 master_log_file, master_log_pos 参见 master 上执行 show status G 的结果.
stop slave;
change master to master_host='172.16.91.40', master_user='repl', master_password='1234abcd', master_log_file='mysql-bin.000002', master_log_pos=469;
start slave;
slave02配置
slave02的配置
/etc/mysql/mysql.conf.d/mysqld.cnf
中的 server-id=3 不一样以外,其他全部一致,这里不再重复.
测试复制功能
至此已完成一主两从的数据库配置,通过图形客户端在 master 的 X 数据库上创建一个表,查看从库是否工作正常.

结束主从配置,得到一个一主两从的 mysql 数据库环境.
读写分离配置实现
下面进行读写分离配置实现.这里有两个中间件可以选择,分别是 maxsacle 和 proxy sql,我们这里采用 maxsacle 实现读写分离.
maxscale 配置
我们从安装包开始安装 maxscale,安装完成后需要对 maxscale 进行配置,配置文件为 /etc/maxscale/maxscale.cnf
安装 maxsacle
https://mariadb.com/downloads/community/maxscale/
下载之后直接通过本地文件安装
sudo apt install ./maxscale-6.3.0-1.ubuntu.focal.x86_64.deb
配置 maxscale
配置文件位置:

[maxscale]
[maxscale]
threads=auto
admin_host=0.0.0.0
admin_secure_gui=false
threads:maxscale 线程数,auto 表示自动根据 cpu 设置;admin_host:允许通过 web 端访问 maxscale 的管理端;admin_secure_gui:web 管理端是否开启 https
[server1]
[server1]
type=server
address=172.16.91.41
port=3306
protocol=MariaDBBackend
server1 的配置:master mysql 服务器.
[server2]
[server2]
type=server
address=172.16.91.42
port=3306
protocol=MariaDBBackend
server2 的配置:master mysql 服务器.
[server3]
[server3]
type=server
address=172.16.91.43
port=3306
protocol=MariaDBBackend
server3 的配置:master mysql 服务器.
这里指向的是前面已完成的一主两从服务器.

[MariaDB-Monitor]
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=repl
password=1234abcd
monitor_interval=2000
监视器用于监视 3 个数据库服务器的状态,这里直接使用之前配置的 repl 账户,就不再创建账户了.
[Read-Only-Service]
#[Read-Only-Service]
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#password=mypwd
#router_options=slave
Read-Only 默认已配置,由于本方案采用读写分离,需要将整个 Read-Only-Service 注释掉

[Read-Write-Service]
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=repl
password=1234abcd
enable_root_user=1
这是需要配置的核心服务,提供读写分离服务,这里直接使用之前配置的 repl 账户,就不再创建账户了.enable_root_user=1 允许 root 访问,否则需要另外创建用户才可以访问.
[Read-Write-Listener]
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
设置 maxsacle 自动启动,重启服务使之生效
sudo systemctl enable maxscale
sudo systemctl restart maxscale
最后将服务在 4006 端口对外提供,配置至此完成,我们就可以在 o2server 服务器上修改配置,将数据库链接指向 172.16.91.40:4006 端口,就可以实现读写分离了.前面我们已经开启的 gui 管理端口:

修改 o2server 配置接入环境
修改 config/externalDataSources.json
[
{
"url":"jdbc:mysql://172.16.91.40/X?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",
"username" : "root",
"password" :"password",
"includes": [],
"excludes": [],
"enable" : true
}
]
[
{
"url":"jdbc:mysql://127.0.0.1:4008/X?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",
"username" : "root",
"password" :"1234abcd",
"includes": [],
"excludes": [],
"enable" : true
}
]也可以通过数据日志验证读写分离.
或者通过 maxctrl list servers 查看分发情况:

报表和数据仓库接入
同理,可以配置 [Read-Only-Service] 实现数据的只读访问,用于报表软件统计、数据仓库拉取数据等只读数据访问场景.