合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# Mariadb Galera Cluster集群简介 - MaraiDB集群是MariaDB同步多主机集群,它仅支持XtraDB/InnoDB存储引擎 - 主要功能:同步复制;真正的multi-master,即所有节点可以同时读写数据库;自动的节点成员控制,失效节点自动清除; 新节点加入数据自动复制;真正的并行复制,行级;用户可以直接连接集群,使用感受上与MySQL完全一致。 - 优势:多主,所以不存在Slavelag(延迟);不存在丢失事务的情况;同时具有读和写的扩展能力;更小的客户端延迟;节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的。 # 安装mariadb Galera 1)在三个节点上分别执行: ``` yum -y install MariaDB-server MariaDB-client galera xinetd rsync ntp ntpdate bash-completion percona-xtrabackup socat gcc gcc-c++ systemctl start mariadb.service systemctl enable mariadb.service mysql_secure_installation(执行设置mysql密码,我的密码为yjscloud) ``` 2)在三个节点上创建sst用户,目的是给xtraback-v2数据同步使用: ``` grant all privileges on *.* to 'sst'@'localhost' identified by 'yjscloud'; flush privileges; ``` 3)配置MariaDB Cluster集群(注:max_allowed_packet、innodb_buffer_pool_size、innodb_log_file_size可以适当调整的参数,以下配置适用于服务器,如果在配置较低的虚拟机上请下调参数值,否则可能导致mariadb无法启动) 第一个节点,添加内容如下: ``` vim /etc/my.conf.d/client.cnf ``` 添加内容: ``` [client] port = 3306 socket = /var/lib/mysql/mysql.sock ``` ``` vim /etc/my.cnf.d/server.conf ``` 添加的内容: ``` [isamchk] key_buffer_size = 16M   #key_buffer_size这个参数是用来设置索引块(index blocks)缓存的大小,它被所有线程共享,严格说是它决定了数据库索引处理的速度,尤其是索引读的速度 [mysqld] datadir=/var/lib/mysql #指定数据data目录绝对路径 innodb-data-home-dir = /var/lib/mysql #指定innodb数据库存放的家目录 basedir = /usr #指定mariadb的安装路径,填写全路径可以解决相对路径所造成的问题 binlog_format=ROW #该参数可以有三种设置值:row、statement和mixed。row代表二进制日志中记录数据表每一行经过写操作后被修改的最终值。各个参与同步的salve节点,也会参照这个最终值,将自己数据表上的数据进行修改;statement形式是在日志中记录数据操作过程,而非最终的执行结果。各个参与同步的salve节点会解析这个过程,并形成最终记录;mixed设置值,是以上两种记录方式的混合体,MySQL服务会自动选择当前运行状态下最合适的日志记录方式 character-set-server = utf8 #设置数据库的字符集 collation-server = utf8_general_ci #collation是描述数据在数据库中是按照什么规则来描述字符的,以及字符时如何被排序和比较,这里我们设置的字符格式是utf8-general_ci max_allowed_packet = 256M #设置mysql接收数据包的最大值,比如你执行的sql语句过大,可能会执行失败,这个参数就是让能执行的sql语句大小调高 max_connections = 10000 #设置mysql集群最大的connection连接数,这个在openstack环境里非常重要 ignore-db-dirs = lost+found #设置忽略把lost+found当做数据目录 init-connect = SET NAMES utf8 #设置初始化字符集编码(仅对非超级用户有效) innodb_autoinc_lock_mode = 2 #这种模式下任何类型的inserts都不会采用AUTO-INC锁,性能最好,但是在不同一条语句内部产生auto_increment值间隙 innodb_buffer_pool_size = 2000M #设置缓冲池字节大小,innodb缓存表和索引数据的内存区域;这个值设置的越大,在不止一次的访问相同的数据表数据时,消耗的磁盘I/O就越少。在一个专用的数据库服务器,则可能将其设置为高达80%的机器物理内存大小。不过在实际的测试中,发现无限的增大这个值,带来的性能提升也并不显著,对于cpu的压力反而增大,设置合理的值才是最优。 innodb_doublewrite = 0 #设置0是禁用doublewrite,一般在不关心数据一致性(比如使用了RAID0)或文件系统可以保证不会出现部分写失效,你可以通过将innodb_doublewrite参数设置为0还禁用doublewrite。 innodb_file_format = Barracuda #设置文件格式为Barracuda,Barracuda 是innodb-plugin后引入的文件格式,同时Barracuda也支持antelope文件格式,Barracuda在数据压缩上优于antelope,配合下面的innodb_file_per_table=1使用 innodb_file_per_table = 1 #开启独立的表空间,使每个innodb的表,有自己独立的表空间。如删除文件后可以回收那部分空间。 innodb_flush_log_at_trx_commit = 2 #默认值1:每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的,特别是使用电池供电缓存(Battery backed up cache)时。设成2:意思是不写入硬盘而是写入系统缓存,日志乃然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0写入会更快一点,但安全方面比较差,mysql挂了可能会丢失事务的数据。设置为2只会在整个操作系统挂了是才会可能丢失数据,所以在openstack环境里设置为2安全点 innodb_flush_method = O_DIRECT #设置打开、刷写模式,设置O_DIRECT的意思是innodb使用O_DIRECT打开数据文件,使用fsync()更新日志和同步的,因此不管是read()系统调用还是write()系统调用,数据都保证是磁盘上读取的,所以单纯从写入的角度讲O_DIRECT模式性能最差,但是在openstack环境下设置这个模式可以减少操作系统级别vfs的缓存使用内存过多和innodb本身的buffer的缓存冲突,同步也算是给操作系统减少点压力。 innodb_io_capacity = 500 #这里参数据控制innodb checkpoint时的io能力,一般可以按一块SAS 15000转的磁盘200个计算,6块盘的SAS做的Raid10这里值可以配到600即可。如果是普通的SATA一块盘只能按100算,这里要注意,对于普通机械盘,由于其随机IO的IOPS的最多也就是300,所以innodb_io_capacity开的过大,反而回造成磁盘io不均匀;如果是ssd场景,由于IO能力大大增强,所以innodb_io_capacity可以提高,可以配置到2000以上,但是目前的openstack环境为了节约成本都是普通机械硬盘,所以这里一般根据自己环境情况调试值 innodb_locks_unsafe_for_binlog = 1 #开启事物锁机制,强制mysql使用多版本数据一致性读 innodb_log_file_size = 2000M #如果对innodb数据表有大量的写入操作,那么选择合适的innodb_log_file_size值提升mysql性能很重要。然而设置太大了,就会增加恢复的时间,因此在mysql奔溃或者突然断电情况会令mysql服务器花很长时间来恢复。 innodb_read_io_threads = 8 #设置数据库读磁盘文件的线程数,用于并发;根据服务器cpu核心数以及读写频率设置 innodb_write_io_threads = 8 #设置数据库写磁盘文件的线程数,用于并发;根据服务器cpu核心数以及读写频率设置 key_buffer_size = 64 #这个参数是用来设置索引块(index blocks)缓存的大小,它被所有线程共享,严格说是它决定了数据库索引处理速度,尤其是索引读得速度。那我们怎么才能知道key_buffer_size的设置是否合理呢,一般可以检查状态值key_read_requests和key_reads,比例key_reads/key_read_requests应该尽可能的低,比如1:100;1:1000,1:10000。其值可以show status like 'key_read%';命令查得 myisam-recover-options = BACKUP #设置自动修复MyISAM表的方式,BACKUP模式会自动修复;这种模式如果恢复过程,数据文件被更改了,会将tbl_name.MYD文件备份为tbl_name-datetime.BAK myisam_sort_buffer_size = 64M #设置MyISAM表发生变化是重新排序所需要的缓冲值,一般64M足够 open_files_limit = 102400 #设置最大文件打开数,需要参照OS的ulimit值和max_connections的大小 performance_schema = on #打开收集数据库性能参数的数据库 query_cache_limit = 1M #设置单个查询能够使用的缓冲区大小 query_cache_size = 0 #关闭query_cache query_cache_type = 0 #关闭query_cache_type skip-external-locking #设置跳过“外部锁定”,当“外部锁定”起作用是,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定;由于服务器访问数据表时经常需要等待解锁,因此会让mysql性能下降,所以这里设置跳过 skip-name-resolve #禁用DNS主机名查找 socket = /var/lib/mysql/mysql.sock #设置mysql.sock的绝对够路径 table_open_cache = 10000 #描述符缓存大小,可减少文件打开/关闭次数 thread_cache_size = 8 #可以用show status like 'open%table';查看当前open_tables的值是多少,然后适当调整 thread_stack = 256K #用来存放每个进程的标识信息,如线程id,线程运行时间环境的等,可以通过设置thread_stack来决定给每个线程分配多大的内存 tmpdir = /tmp #设置mysql临时文件存放的目录 user = mysql #设置mysql数据的系统账户名 wait_timeout = 1800 #设置单个connection空闲连接的超时时间,mysql默认是8小时,这里我们设置为1800秒,也就是说,一个connection如果空闲超过30分钟,那么就会被释放 [galera] bind-address=10.1.1.120 #mysql服务绑定的ip wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://10.1.1.120,10.1.1.121,10.1.1.122" #gcomm是特殊的地址,仅仅是Galera cluster初始化启动时候使用 wsrep_cluster_name = openstack #mysql cluster集群名称 wsrep_node_name=controller1 wsrep_node_address=10.1.1.120 #此节点ip地址 wsrep_on=ON wsrep_slave_threads=4 #指定线程数量,建议每个core启动4个复杂线程,这个参数很大程度上受到I/O能力的影响 wsrep_sst_method=xtrabackup-v2 #有xtrabackup模式和rsync模式:新版本的支持xtrabackup-v2模式,rsync在数据同步(SST和IST)的时候,速度最快,但是会锁住数据节点,然后无法提供访问;xtrabackup只会短暂的锁住节点,基本不影响访问。SST:state snapshot tranter ,节点初始化的方式方式,做数据的全量同步;IST:incremental state tranter ,当一个节点加入,他当前的GUID与集群相同,缺失的数据能够在donor的writeset的cache中找到,否则只能全部初始化数据走SST模式。经过相关调研,目前xtrabackup-v2模式是最好的SST方式 wsrep_sst_auth=sst:yjscloud #设置sst同步数据所需的mysql用户和密码,因此上面我们用的是xtrabackup-v2模式,那么xtrabackup-v2模式就会用到sst这个mysql用户去做节点之间的验证,yjscloud是密码 default_storage_engine=InnoDB #设置数据库默认引擎为innodb [mysqld_safe] nice = 0 #调用系统的nice命令设置进程优先级,linux系统用户只能在0-19中设置,mysql用户为普通用户,设置为0应该就是让mysql进程优先级最高了 socket = /var/lib/mysql/mysql.sock syslog ``` ``` vim /etc/my.cnf.d/mysql-client.cnf ``` 添加的内容: ``` [mysqldump] max_allowed_packet = 16M #mysql根据配置文件会限制server接受数据包的大小,有时候大的插入和更新会受到max_allowed_packet参数限制,导致写入或者更新失败 quick #强制mysqldump从服务查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中 quote-names #使用()引用表和列名。默认为打开状态,使用--skip-quote-names取消该选项。 ``` 第二和第三个个节点的my.cnf配置如下,**注意改下相关ip和节点名称**: client.cnf文件直接scp过去 ``` scp -p client.cnf controller2:/etc/my.cnf.d/client.cnf scp -p client.cnf controller3:/etc/my.cnf.d/client.cnf ``` mysql-client.cnf也scp过去其他两节点 ``` scp -p mysql-clients.cnf controller2:/etc/my.cnf.d/mysql-clients.cnf scp -p mysql-clients.cnf controller3:/etc/my.cnf.d/mysql-clients.cnf ``` server.cnf也用scp拷贝过去 ``` scp -p server.cnf controller2:/etc/my.cnf.d/server.cnf scp -p server.cnf controller3:/etc/my.cnf.d/server.cnf ``` **修改一下server.cnf ip地址和节点名称** 设置mysql最大连接数 ``` vim /usr/lib/systemd/system/mariadb.service ``` 在`[Service]`添加两行如下参数: ``` LimitNOFILE=10000 LimitNPROC=10000 ``` ``` scp -p /usr/lib/systemd/system/mariadb.service controller2:/usr/lib/systemd/system/mariadb.service scp -p /usr/lib/systemd/system/mariadb.service controller3:/usr/lib/systemd/system/mariadb.service ``` 都修改完毕后:`systemctl daemon-reload` 最后等启动了mariadb服务就能通过`show variables like 'max_connections';` 4)关于mysql服务的启动顺序 三个节点my.cnf都配置完成后,三个节点的mariadb全部执行:`systemctl stop mariadb.service` 然后在第一个节点用下面的命令初始化启动mariadb: ``` /usr/sbin/mysqld --wsrep-new-cluster --user=root & ``` 其他两个节点分别启动mariadb ``` systemctl start mariadb.service systemctl status mariadb.service ``` 最后,其他两个节点启动成功了,再回到第一个节点执行: ``` pkill -9 mysql pkill -9 mysql systemctl start mariadb.service systemctl status mariadb.service ``` 5)查看mariadb数据库集群状态 ![8-1-9](http://pded8ke3e.bkt.clouddn.com/8-1-9.jpg) 登录这两个节点的mysql里,发现mysql集群数变成了3,说明这个集群有3个节点了,集群已经搭建。