MySQL主从/集群

数据库的主从复制配置(在一个系统启动两个数据库)

  • 创建数据库基本的目录
    mkdir -p /data/{3307,3308}/{etc,socket,pid,log,data,binlog,relay-bin}
  • 给目录设置属主属组(避免数据的启动时候没有权限)
    chown -R mysql.mysql /data/
  • 初始化数据库(让数据库加载最基本的文件)
    mysql_install_db --datadir=/data/3307/data --user=mysql --basedir=/usr
    mysql_install_db --datadir=/data/3308/data --user=mysql --basedir=/usr
  • 编写配置文件
    #编写第一个数据库的配置文件
    
    vi /data/3307/etc/my.cnf
    
    [mysqld]
    port=3307
    log-bin=/data/3307/binlog/mysql-bin
    datadir=/data/3307/data
    socket=/data/3307/socket/mysql.sock
    symbolic-links=0
    server-id=1
    collation-server=utf8_general_ci
    character-set-server=utf8
    
    [mysqld_safe]
    log-error=/data/3307/log/mariadb.log
    pid-file=/data/3307/pid/mariadb.pid
    
    
    
    #编写第二个数据库的配置文件
    vi /data/3308/etc/my.cnf
    
    [mysqld]
    port=3308
    log-bin=/data/3308/binlog/mysql-bin
    datadir=/data/3308/data
    socket=/data/3308/socket/mysql.sock
    symbolic-links=0
    server-id=2
    collation-server=utf8_general_ci
    character-set-server=utf8
    
    [mysqld_safe]
    log-error=/data/3308/log/mariadb.log
    pid-file=/data/3308/pid/mariadb.pid
  • 启动数据库
   mysqld_safe --defaults-file=/data/3307/etc/my.cnf &					#放到后端执行,不然会占一个终端
   mysqld_safe --defaults-file=/data/3308/etc/my.cnf &
  • 登录数据库
    mysql -uroot -S /data/3307/socket/mysql.sock						#没有办法区分数据库登录,只能用客户端sock文件启动
    mysql -uroot -S /data/3308/socket/mysql.sock							
  • 主授权主从复制账号
    grant replication slave on *.* to 'slave'@'127.0.0.1' identified by '123';		#主数据库为从数据授权
  • 查看binlog节点
    show master status;
  • 设置同步内容
    cchange master to master_host='127.0.0.1',master_port=3307, master_user='slave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=393;   #这是一行数据
  • 从开启主从复制
    start slave;
  • 从查看主从状态
show slave status\G

数据库集群(三台PC实现负载均衡)

Galera是一个mysql的同步多主集群软件,目前只支持INnoDB存储引擎

功能:

  • 同步复制
  • Multi-master,及所有节点都可以同时进行读写操作
  • 自动的成员节点控制,失效节点自动被剔除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级

优点:

  • 因为是多主,不存在slave lag(延迟)
  • 不存在丢失交易的情况
  • 同时具有读写的能力
  • 更小的客户端延迟
  • 节点间的数据是同步的(使用rsync进行同步)

Galera Cluster集群安装

集群需求最少3个节点,只有mariadb和Percona两个版本,不支持原生mysql

  • 添加源
vi /etc/yum.repos.d/mariadb.repo
[mariadb]
name=MariaDB
baseurl=http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=0
  • 安装mariadb服务
yum -y install MariaDB-server MariaDB-clientgalera
  • 创建数据库使用的目录
mkdir -p /data/3306/{etc,socket,pid,log,data,binlog,relay-bin}
chown -R mysql.mysql /data/
  • 修改配置文件(一)
vi /data/3306/etc/my.cnf

[mysqld]
port=3306
log-bin=/data/3306/binlog/mysql-bin
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
symbolic-links=0
server-id=1
collation-server=utf8_general_ci
character-set-server=utf8

[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid

[galera]
wsrep_causal_reads=ON  								#节点应用完事务才返回查询请求
wsrep_provider_options="gcache.size=512M" 			#同步复制缓冲池(不要超过物理机器的运行内存)
wsrep_certify_nonPK=ON   							#为没有显式申明主键的表生成一个用于certificationtest的主键,默认为ON
query_cache_size=0           						#关闭查询缓存
wsrep_on=ON   										#开启全同步复制模式
wsrep_provider=/usr/lib64/galera/libgalera_smm.so #galera library
wsrep_cluster_name=MariaDB-Galera-Cluster
wsrep_cluster_address="gcomm://172.16.238.186,172.16.238.187,172.16.238.188"  			#galera cluster URL
wsrep_node_name=localhost
wsrep_node_address=172.16.238.186
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2   						#主键自增模式修改为交叉模式
wsrep_slave_threads=8  								#开启并行复制线程,根据CPU核数设置
innodb_flush_log_at_trx_commit=0   					#事务提交每隔1秒刷盘
innodb_buffer_pool_size=128M
wsrep_sst_method=rsync
  • 修改配置文件(二)
vi /data/3306/etc/my.cnf

[mysqld]
port=3306
log-bin=/data/3306/binlog/mysql-bin
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
symbolic-links=0
server-id=2						#第二个id号
collation-server=utf8_general_ci
character-set-server=utf8

[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid

[galera]
wsrep_causal_reads=ON  
wsrep_provider_options="gcache.size=512M" 
wsrep_certify_nonPK=ON  
query_cache_size=0      
wsrep_on=ON  
wsrep_provider=/usr/lib64/galera/libgalera_smm.so 
wsrep_cluster_name=MariaDB-Galera-Cluster
wsrep_cluster_address="gcomm://172.16.238.186,172.16.238.187,172.16.238.188" 
wsrep_node_name=localhost
wsrep_node_address=172.168.238.187		#本机数据库的IP地址
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2 
wsrep_slave_threads=8 
innodb_flush_log_at_trx_commit=0 
innodb_buffer_pool_size=128M
wsrep_sst_method=rsync
  • 修改配置文件(三)
vi /data/3306/etc/my.cnf

[mysqld]
port=3306
log-bin=/data/3306/binlog/mysql-bin
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
symbolic-links=0
server-id=3							#第三个id号
collation-server=utf8_general_ci
character-set-server=utf8

[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid

[galera]
wsrep_causal_reads=ON  
wsrep_provider_options="gcache.size=512M" 	#同步复制缓冲池(不要超过物理机器的运行内存)
wsrep_certify_nonPK=ON  
query_cache_size=0      
wsrep_on=ON  
wsrep_provider=/usr/lib64/galera/libgalera_smm.so 
wsrep_cluster_name=MariaDB-Galera-Cluster	
wsrep_cluster_address="gcomm://172.16.238.186,172.16.238.187,172.16.238.188" 
wsrep_node_name=localhost
wsrep_node_address=172.168.238.187		#本机数据库的IP地址
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2 
wsrep_slave_threads=8 
innodb_flush_log_at_trx_commit=0 
innodb_buffer_pool_size=128M
wsrep_sst_method=rsync
  • 初始化数据库
mysql_install_db --defaults-file=/data/3306/etc/my.cnf --user=mysql
  • 启动集群数据库
mysqld_safe --defaults-file=/data/3306/etc/my.cnf --user=mysql --wsrep-new-cluster &		#第一个数据库要启动集群管理
mysqld_safe --defaults-file=/data/3306/etc/my.cnf --user=mysql &		
mysqld_safe --defaults-file=/data/3306/etc/my.cnf --user=mysql &	
  • 登录数据库
mysql -uroot -S /data/3306/socket/mysql.sock
  • 查看集群状态
show status like "wsrep_cluster_size";
show status like "wsrep%";

测试

第一个数据库
create database alice;		#创建数据库

!!!在其他数据库上查看创建的数据库

第二个数据库
use alice;		#进入数据库
create table t1 (id int(5), name char(10));		#创建表

!!!在其他数据库上查看创建的表

第三个数据库
insert into t1 (id,name) values (1, 'zhangsan'),(2, 'lisi');		#在表里添加数据

!!!在其他数据库上查看表中添加的数据

版权声明:本文为qq_42345960原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>