神舟通用数据库读写分离(RW)集群
神舟通用数据库读写分离(RW)集群的架构图如下所示,
和神通DB的HA架构不同,RW集群是share nothing的架构,每个节点都保存一份数据库,通过事务日志,传输db的更改,来保证多个节点的数据一致性。节点又分同步节点和异步节点,从Oracle DBA的角度讲,基本原理和Oracle ADG一样,RW集群的同步节点相当于ADG的最大保护模式,异步节点相当于最大性能模式。
“神通DB的RW集群,最大可以有9个节点,各节点的地位默认都是平等的,也可以设置节点的权值,使权值最大的同步节点优先成为主机。正常工作状态下,master及时将自己产生的日志同步到slave,以保证主备之间的数据一致性,用户对master所作的任何更新操作,都会在slave上得到体现。如果同步slave长时间收不到master的心跳信息,将会在集群的同步节点之间发起选举操作,选出新的master,并继续对用户提供数据服务。而这种切换对于用户而言是基本透明的(只需进行重新连接)。如果slave端发生故障,而master仍处于活动状态时,只要发生故障的同步节点小于集群同步节点总数的二分之一,集群系统仍继续对外提供数据服务,对用户不会产生任何影响,只需DBA及时对slave进行故障排除即可。”
“神通高可用集群系统中的备机是可读的,在此基础上提供了读写分离功能。JDBC 驱动包含了分发的功能,可以导致一方面用户可以直接连接备机执行只读查询操作,另一方面也可以通过驱动进行读写分离:驱动自动对用户执行的SQL语句进行读写分类,将写操作发送到主机执行,将只读操作发送到备机执行,驱动按照一定的算法进行负载均衡,以达到提升系统整体性能的目的。”
另外,神通DB RW集群不需要第三方集群软件管理浮动IP,数据库自身就可以完成浮动IP的管理,这里不是依靠HA服务,而是数据库服务和agent服务,实际上,为了避免浮动IP的配置冲突,使用RW集群时,最好把神通DB的HA服务关掉。
神通DB的RW集群配置步骤还是非常简单的,我们用3台服务器举例:
虚拟机 | 服务IP | 心跳IP |
centos75vm1 | 192.168.204.121 | 192.168.42.121 |
centos75vm2 | 192.168.204.122 | 192.168.42.122 |
centos75vm4 | 192.168.204.124 | 192.168.42.124 |
三台服务器的OS都是redhat 7.5,神通db软件安装过程略过,都是安装在缺省位置/opt/ShenTong。
首先在centos75vm1上创建数据库,注意一定要启用归档模式,其他都用缺省值。然后将数据库备份,备份可以用神通数据库自带的“数据库维护工具”,启动命令行是/opt/ShenTong/bin/oem
备份完成后,将生成的一个备份文件分别FTP到其他两台服务器。还是用这个工具恢复数据库。备份类型选择外部备份,然后指向ftp过来的备份文件:
保证数据库恢复后可以正常启动。
然后关闭3个节点的数据库,修改数据库参数文件OSRDB.conf,修改下面几个参数:
HOTSTANDBY_DATABASE_TYPE=2 ENABLE_HA_SINGLE_ALIVE=false HA_LOCAL_NET_DEV_NAME='ens33:1' ### 这个网卡设备名就是服务IP对应的设备 HA_SERVER_IP_ADDRESS='192.168.204.10' ### 这个是对外提供服务的浮动IP HA_GATEWAY='192.168.204.2'
然后启动3个节点的数据库。
在一节点,使用iSQL登入数据库,然后将第一个节点,也是master节点计入集群:
alter database add node ‘192.168.42.121’
然后将另外两个节点加入集群
alter database add node ‘192.168.42.122’ sync
slave节点刚加入的时候,先是以异步节点的方式加入,等日志同步了,再转变成同步方式:
SQL> alter database add node 4 '192.168.42.124' sync; NOTICE, 新增节点已先改成异步方式,正在等日志同步上之后自动改为同步.. NOTICE, 已将节点改为同步节点 ALTER DATABASE SET
可以指定node编号,也可以不指定,让系统自动指定,后续操作节点,可以用node编号来引用。
添加完节点,RW集群就算配置完成了,可以用过查看v_sys_ha_slave_info视图,查看节点状态:
SQL> select node_id,address,synclog,status,port from v_sys_ha_slave_info;
NODE_ID | ADDRESS | SYNCLOG | STATUS | PORT
---------+----------------+---------+--------+------
1 | 192.168.42.121 | t | master | 0
2 | 192.168.42.122 | t | slave | 2003
4 | 192.168.42.124 | t | slave | 2003
查看网卡信息,也能看到浮动IP已经绑定在1节点:
[root@centos75vm1 admin]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.204.121 netmask 255.255.255.0 broadcast 192.168.204.255 inet6 fe80::3431:6d21:e67c:df0 prefixlen 64 scopeid 0x20<link> inet6 fe80::9008:5f98:8fb3:ce9e prefixlen 64 scopeid 0x20<link> ether 00:0c:29:62:81:31 txqueuelen 1000 (Ethernet) RX packets 31950 bytes 4284586 (4.0 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 33742 bytes 22179125 (21.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.204.10 netmask 255.255.255.0 broadcast 192.168.204.255 ether 00:0c:29:62:81:31 txqueuelen 1000 (Ethernet)
应用要实现读写分离,还需要在jdbc或aci环节进行其他设置,具体参考神通数据库的联机文档中《数据库开发手册》中两种分发器的配置章节,这里就不赘述了。
我们可以用直接关掉虚拟机centos75vm1,模拟掉电,等几秒,可以看到master节点变为其他同步节点,浮动IP已经飘移到其他机器:
SQL> select node_id,address,synclog,status,port from v_sys_ha_slave_info;
NODE_ID | ADDRESS | SYNCLOG | STATUS | PORT
---------+----------------+---------+---------+------
1 | 192.168.42.121 | t | offline | 0
2 | 192.168.42.122 | t | slave | 2003
4 | 192.168.42.124 | t | master | 0
(3 rows)
我们还可以将不同节点的权重设置为不同值,比如可以将centos75vm1的权重设置的比其他节点高,那么当centos75vm1修复后,根据权重,这个节点又会自动成为master节点,原来的master节点会重启,变为slave。
修改权重的语句:
alter database alter node 1 weight 20;
SQL> select * from v_sys_ha_slave_info; NODE_ID | ADDRESS | SYNCLOG | STATUS | PORT | READABLE | SYNCHRONIZED | WEIGHT | START_LSN | NEXT_SEND_LSN | NEXT_FLUSH_LSN | NEXT_REDO_LSN | TRANSMISSION_TIME ---------+----------------+---------+---------+------+----------+--------------+--------+-----------+---------------+----------------+---------------+------------------- 1 | 192.168.42.121 | t | offline | 0 | f | f | 20 | 0 | 0 | 0 | -1 | -1 2 | 192.168.42.122 | t | slave | 2003 | t | f | 0 | 7485952 | 7487488 | 7487488 | 7487504 | 0 4 | 192.168.42.124 | t | master | 0 | f | f | 0 | 7487488 | 0 | 7487488 | 7487488 | 0 (3 rows)
启动centos75vm1,等一段时间,可以看到master重新回到了node 1:
SQL> select * from v_sys_ha_slave_info; NODE_ID | ADDRESS | SYNCLOG | STATUS | PORT | READABLE | SYNCHRONIZED | WEIGHT | START_LSN | NEXT_SEND_LSN | NEXT_FLUSH_LSN | NEXT_REDO_LSN | TRANSMISSION_TIME ---------+----------------+---------+--------+------+----------+--------------+--------+-----------+---------------+----------------+---------------+------------------- 1 | 192.168.42.121 | t | master | 0 | f | f | 20 | 7488000 | 0 | 7488000 | 7488000 | 0 2 | 192.168.42.122 | t | slave | 2003 | t | f | 0 | 7486976 | 7488000 | 7488000 | 7488016 | 0 4 | 192.168.42.124 | t | slave | 2003 | t | f | 0 | 7486976 | 7488000 | 7488000 | 7488016 | 0 (3 rows)