Preparando el entorno
Se requieren al menos dos servidores, que deben ser dos equipos independientes, por supuesto, también se pueden utilizar máquinas virtuales.
1) Construya las bases de datos maestra y esclava por separado y los registros de salida (para una fácil localización de problemas)
configure la ruta del registro
2) Instalación y arranque:
modifique la ruta my.ini en el maestro a la ruta maestra
mysqld --install MySQLXY --defaults -file = "C: \ Archivos de programa \ MySQL \ MySQL Server XY \ my.ini"
(instalar / eliminar el servicio denegado el permiso no es suficiente para ejecutarlo como administrador)
net start MySQLXY
Sc eliminar maestro / esclavo Si realiza un error, puede eliminar el servicio y reiniciar la operación para
abrir el registro (no es necesario)
(No es necesario) Active el registro de la declaración SQL, no se recomienda activarlo en el entorno de producción:
Verifique el directorio de registro y abra el registro de la declaración sql:
mysql> mostrar variables como '% general_log%';
mysql> set global general_log = on;
Después de abrir, reinicie Mysql, la configuración de registro de apertura mencionada anteriormente no será válida.
configuración del servidor maestro
1) Modificar mysql.ini del maestro
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog_ignore_db=mysql
binlog_checksum=none
2) Reinicie el servicio maestro e inicie sesión.
3) Autorice la cuenta y los permisos del servidor savle.
Escenario:
servidor maestro maestro: 192.168.1.101
servidor esclavo: 192.168.1.102
1. Derecho al servidor de base de datos esclavo 192.168.10.131 (usuario maestro , solo para El servidor esclavo está abierto) La
sintaxis es: GRANT REPLICATION SLAVE ON . to'Username'@'192.168.0.102 'identificado por'Password';
Mysql> GRANT REPLICATION SLAVE ON *.* to 'lvtest'@'192.168.77.128'identified by 'admin';
Descripción del parámetro:
lvtest: cuenta
IDENTIFICADA POR'admin 'utilizada por el esclavo para conectarse al maestro: contraseña utilizada por el esclavo para conectarse al maestro
192.168.77.128 : IP del esclavo
2 Consultar el estado de la base de datos maestra
Mysql> mostrar estado maestro;
± ------------------- ± --------- ± ----- --- ------ ± ----------------------------- +
| Archivo | Posición | Binlog_Do_DB | Binlog_Ignore_DB |
± --- ---------------- ± --------- ± -------------- ± ----- --- --------------------- +
| mysql-bin.000002 | 226 | | mysql |
± ------------ --- ---- ± --------- ± -------------- ± ----------------- --- --------- +
Registre el valor de Archivo y Posición, úselo en el lado esclavo
configuración esclava
1. Modifique el archivo de configuración my.ini del servidor esclavo para cambiar server-id = 1 a server-id = 10, y asegúrese de que este
ID no sea utilizado por otros servicios MySQL.
2. Inicie el servidor esclavo e inicie sesión.
3. En el lado esclavo, configure la información del enlace maestro (declaración de ejecución)
1) Configure
Mysql> cambie maestro a
master_host = '192.168.77.1', #master IP
master_user = 'lvtest' , # la base de datos maestra pasó GRANT cuenta autorizada
master_password = 'admin', # contraseña de la base de datos maestra autorizada por GRANT
master_port = 3307, # contraseña de la base de datos
maestra master_log_file = 'mysql-bin.000001',
# nombre del archivo de la base de datos maestra mostrado por show master status
master_log_pos = 296
# base de datos master Valor de posición mostrado por show master status
2) (reiniciar) conectar
Mysql> iniciar esclavo;
3)主从同步检查
show slave status;
其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。
4. Prueba
1) En el maestro, construya una base de datos, cree tablas y agregue datos.
2) Actualice la base de datos esclava, y los registros también existen.
A partir de esto, se completa todo el proceso de replicación maestro-esclavo de MySQL. A continuación, realizar la instalación y configuración de separación lectura-escritura de MySQL.
Leer y escribir separación-fragmentación-jdbc
Archivo de
configuración Configuración básica -> application.yml
server:
port: 8018
spring:
application:
name: bj-sharding-jdbc
main:
allow-bean-definition-overriding: true
profiles:
# rw-读写分离配置 table-数据分表+读写分离 dt-分库分表+读写分离
active: dt
mybatis:
mapper-locations: classpath:/top/qrainly/**/dao/**/*.xml
Configuración de separación de lectura y escritura -> application-rw.yml
sharding:
jdbc:
dataSource:
names: db-test0,db-test1
db-test0:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
password: 123456
maxPoolSize: 20
db-test1:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
username: root
password: 123456
maxPoolSize: 20
config:
# 仅配置读写分离时打开此配置
masterslave:
# 配置从库选择策略,提供轮询与随机,这里选择用轮询//random 随机 //round_robin 轮询
load-balance-algorithm-type: round_robin
name: db1s2
master-data-source-name: db-test0
slave-data-source-names: db-test1
props:
sql:
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志!!!
show: true
Tabla de datos + configuración de separación de lectura-escritura -> application-table.yml
sharding:
jdbc:
dataSource:
names: db-test0,db-test1
db-test0:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
password: 123456
maxPoolSize: 20
db-test1:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
username: root
password: 123456
maxPoolSize: 20
config:
# 配置数据分表
sharding:
tables:
user:
table-strategy:
standard:
sharding-column: id
precise-algorithm-class-name: top.qrainly.sharding.jdbc.config.MyPreciseShardingAlgorithm
# 读取ds_0数据源的user_0、user_1、user_2、user_3
actual-data-nodes: ds_0.user_$->{
0..3}
master-slave-rules:
ds_0:
master-data-source-name: db-test0
slave-data-source-names: db-test1
props:
sql:
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志!!!
show: true
Sub-base de datos subtabla + configuración de separación de lectura-escritura -> application-dt.yml
---
sharding:
jdbc:
datasource:
names: ds-master-0,ds-master-1,ds-master-0-slave-0,ds-master-1-slave-0
# 主库0
ds-master-0:
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/bj_sharding?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
# 主库0-从库0
ds-master-0-slave-0:
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3307/bj_sharding?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
username: root
# 主库1
ds-master-1:
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/bj_sharding1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
# 主库1-从库0
ds-master-1-slave-0:
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3307/bj_sharding1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
username: root
config:
sharding:
tables:
user:
table-strategy:
inline:
sharding-column: id
algorithm-expression: user_$->{
id % 5}
key-generator-column-name: id
actual-data-nodes: ds_$->{
0..1}.user_$->{
0..4}
default-database-strategy:
inline:
# 置的分库的字段,本案例是根据id进行分
sharding-column: id
# 置的分库的逻辑,根据id%2进行分
algorithm-expression: ds_$->{
id % 2}
master-slave-rules:
ds_1:
slave-data-source-names: ds-master-1-slave-0
master-data-source-name: ds-master-1
ds_0:
slave-data-source-names: ds-master-0-slave-0
master-data-source-name: ds-master-0
Nota: El parámetro exclude = {DataSourceAutoConfiguration.class} debe agregarse a @SpringBootApplication en la configuración de la subbase de datos y la subtabla
ok, cambia spring.profiles.active para jugar en diferentes modos de configuración.
Artículo de referencia: https://my.oschina.net/qrainly/blog/3072946