-- 初始化脚本,确保root用户可以从任何主机连接
-- 并创建普通用户
-- 为root用户创建从任意主机访问的账户
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'root123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 确保dbuser在所有节点上都存在
CREATE USER IF NOT EXISTS 'dbuser'@'%' IDENTIFIED BY 'dbpass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;
-- 也保留localhost访问权限
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123456';
FLUSH PRIVILEGES;
步骤 3:创建复制初始化脚本
创建 init-replication.sh 文件:
#!/bin/bash
# MySQL 主从配置初始化脚本
# 📅 创建日期:2026-04-01
# 用途:配置主从复制关系
set -e
echo "🔧 开始配置 MySQL 主从复制..."
echo ""
# 等待主节点就绪
echo "⏳ 等待主节点就绪..."
for i in {1..30}; do
if docker exec mysql-master mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
echo "✅ 主节点已就绪"
break
fi
sleep 2
done
# 等待从节点就绪
echo "⏳ 等待从节点就绪..."
for i in {1..30}; do
if docker exec mysql-slave-1 mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
echo "✅ 从节点1已就绪"
break
fi
sleep 2
done
# 等待从节点2就绪
echo "⏳ 等待从节点2就绪..."
for i in {1..30}; do
if docker exec mysql-slave-2 mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
echo "✅ 从节点2已就绪"
break
fi
sleep 2
done
# 创建复制用户
echo "🔐 创建复制用户..."
docker exec mysql-master mysql -u root -proot123456 <<EOF
CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY 'repl123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
EOF
# 获取主节点位置
echo "📊 获取主节点位置..."
MASTER_STATUS=$(docker exec mysql-master mysql -u root -proot123456 -e "SHOW MASTER STATUS\G")
MASTER_FILE=$(echo "$MASTER_STATUS" | grep "File:" | awk '{print $2}')
MASTER_POS=$(echo "$MASTER_STATUS" | grep "Position:" | awk '{print $2}')
if [ -z "$MASTER_FILE" ] || [ -z "$MASTER_POS" ]; then
echo "❌ 无法获取主节点状态"
exit 1
fi
echo "✅ 主节点位置:$MASTER_FILE:$MASTER_POS"
# 配置从节点 1
echo "🔗 配置从节点 1 (mysql-slave-1)..."
docker exec mysql-slave-1 mysql -u root -proot123456 <<EOF
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123456',
MASTER_LOG_FILE='$MASTER_FILE',
MASTER_LOG_POS=$MASTER_POS,
GET_MASTER_PUBLIC_KEY=1;
START SLAVE;
EOF
# 配置从节点 2
echo "🔗 配置从节点 2 (mysql-slave-2)..."
docker exec mysql-slave-2 mysql -u root -proot123456 <<EOF
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123456',
MASTER_LOG_FILE='$MASTER_FILE',
MASTER_LOG_POS=$MASTER_POS,
GET_MASTER_PUBLIC_KEY=1;
START SLAVE;
EOF
# 等待同步
echo "⏳ 等待复制同步..."
sleep 5
# 验证复制状态
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 验证主从状态"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📌 主节点状态:"
docker exec mysql-master mysql -u root -proot123456 -e "SHOW MASTER STATUS\G"
echo ""
echo "📌 从节点 1 状态:"
docker exec mysql-slave-1 mysql -u root -proot123456 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Host"
echo ""
echo "📌 从节点 2 状态:"
docker exec mysql-slave-2 mysql -u root -proot123456 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Host"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ 主从配置完成!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
from bluepy.btle import Scanner, DefaultDelegate
import time
class ScanDelegate(DefaultDelegate):
def handleDiscovery(self, dev, isNewDev, isNewData):
if isNewDev:
print("Discovered device")
print(" Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
elif isNewData:
print(" Updated data: %s" % dev.scanData)
print(" Manufacturer data: %s" % dev.manufacturerData) # Optional: manufacturer data if available. 0x0000FFFF is the default for BLE devices. 0xFFFF is the default for Beacons. 0x004C is the default for iBeacons. 0x0215 is the default for AltBeacons. 0x0242 is the default for Estimote beacons. 0x0015 is the default for Eddystone beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung