数据库的主从复制配置(在一个系统启动两个数据库)
- 创建数据库基本的目录
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'); #在表里添加数据
!!!在其他数据库上查看表中添加的数据