三台做事器ubuntu14.04
192.168.3.1
192.168.3.2

192.168.3.3
MariaDB(10.1,由于10.1之后自带Gelera,无需单独安装)
Gelera(10.1之前版本须要单独安装)
rsync (集群相互学习利用的默认同步办法)
1. 软件安装
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.1/ubuntu trusty main'
sudo apt-get update
sudo apt-get install rsync mariadb-server
安装软件后,首先把mysql做事停掉,完成配置后在启动。
2. 配置项这里集群最少3台做事器,防止网络颠簸涌现脑裂问题。3个做事器配置是相同的,如下:
vim /etc/mysql/my.cnf
# Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_address=\"大众gcomm://192.168.3.1,192.168.3.2,192.168.3.3\"大众
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name=\公众MariaDB_Cluster\公众
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
3. 启动集群这里顺序比较主要,在个中一台做事器上实行语句:
service mysql start --wsrep-new-cluster
该语句是利用此节点创建一个集群节点,作为初始节点。其他两台做事器利用正常的启动就可以了,不须要利用其他参数:如下
service mysql start
如果碰着问题:ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)
由于集群中利用debian-sys-maint用户登录,而用户的密码是配置在debian.cnf中的,所有办理办法:
找到debian.cnf中的password,并修正成例如newxxx
利用语句重新设置debian-sys-maint的密码。语句见下面
重新启动集群。
set password for 'debian-sys-maint'@'localhost'=password('newxxx');
4. 验证集群分别登录3个节点
mysql -uxxx -pxxxx
利用语句查看集群状态,wsrep_cluster_size = 3,其他参数把稳不雅观察,对后续运维很主要。
show status like 'wsrep_';
last_comitted故障规复利用
箭头参数,运维把稳
5.集群解释(有看头)虽然多个数据库节点实现了高可用,但这里带来一个架构问题,数据同等性问题,在并发较高,对事务哀求比较严格的运用中会涌现问题。
业务场景:
会员A在平台预定了一个产品,在9点整自动下单,此时会从会员中扣除用度。如果在扣费的过程中,A也充值了,很可能就会涌现问题。
最根本的缘故原由:事务没有锁住会员账户。这里牵扯到了两个事务,分别是扣费事务和充值事务。而这两个事务很可能不在同一个数据库节点上,例如扣费事务在01节点锁住账户,并更新余额。02节点没来得及学习,充值事务就来了,02节点也锁住了账户,完成了更新,并开释锁落后修了01的更新,导致02节点丢失了充值事务的操作。
有频繁更新且对事务哀求比较严格的时候,就不要考虑利用这种办法,这种办法适宜写多、并发更新少的场景。
Q:有办法避免事务不一致的问题吗?
A:改为读写分离的代码实现,完美办理上述问题。选择个中两个节点做VIP,其余一个做Master。把稳利用sharding-jdbc,引入maven后数据源配置如下。
代码示例:
用图片看代码更爽
把稳:同一线程且同一数据库连接内,如有写入操作,往后的读操作均从主库读取,用于担保数据同等性。所有利用这种办法,能知足绝大多数业务场景了。
感谢您的阅读,不敷之处,还望示正。有疑问,可留言。