mysql负载均衡完美解决方案

article/2025/8/25 3:32:30
1.环境: 
mysql 5
ubuntu10.04 x86_64

mdb1        eth0    192.168.5.11 
mdb2        eth0    192.168.5.12
sdb1        eth0    192.168.5.21 
sdb2        eth0    192.168.5.22 
sdb3        eth0    192.168.5.23 
sdb4        eth0    192.168.5.24
haproxy 
        eth0    192.168.5.10    (mdb  vip write) 
        eth1    192.168.5.20    (sdb  vip read)
说明:mdb vip用于DB的写,sdb vip用于DB读,实现读写分离和负载均衡,带故障检测自动切换

2.架构图 
        web1    web2    web3 
         |              |          | 
        —————————- 
                    | 
            haproxy(lb db write/read) 
                    | 
        ———————————- 
        |                                | 
        mdb1                     mdb2 
          |                              | 
        ————–             —————- 
        |             |              |            | 
        sdb1    sdb2        sdb3      sdb4
说明: 
1)mdb1和mdb1配置成主-主模式,相互同步,通过haproxy提供一个lb的写ip 
2)sdb1和sdb2配置为mdb1的从,sdb3和sdb4配置为mdb2的从 
3)sdb1,sdb2,sdb3,sdb4这4台从库,通过haproxy提供一个lb的读ip 
4) 当mdb2停止复制,mdb1为主库,haproxy停止发送请求到mdb2和sdb3,sdb4 
5) 当mdb1停止复制,mdb2为主库,haproxy停止发送请求到mdb1和sdb1,sdb2 
6) 当mdb1和mdb2同时停止复制,这时2台主库变成readonly模式,数据库不能写入 
7)当mdb2 offline时,mdb1进入backup mode,停止发送请求到mdb2,sdb3,sdb4 
8)当mdb1 offline时,mdb2进入backup mode,停止发送请求到mdb1,sdb1,sdb2 
9) 当mdb1 mdb2同时offline,整个DB停止工作


3.安装mysql-server 
登录mdb1,mdb2,sdb1,sdb2,sdb3,sdb4,输入以下命令进行安装: 
apt-get install mysql-server -y
安装时会提示输入mysql root用户密码,输入gaojinbo.com
修改mysql配置,监听所有接口 
vi /etc/mysql/my.cnf 
修改为: 
bind-address            = 0.0.0.0
重启mysql 
/etc/init.d/mysql restart


4.配置mdb1,mdb2主-主同步 
1)mdb1: 
vi /etc/mysql/my.cnf 
server-id               = 1 
log_bin                 = mysql-bin
log-slave-updates                #很重要,从前一台机器上同步过来的数据才能同步到下一台机器 
expire_logs_days        = 10 
max_binlog_size         = 100M 
auto_increment_offset    = 1 
auto_increment_increment = 2

2)mdb2: 
vi /etc/mysql/my.cnf 
server-id               = 2 
log_bin                 = mysql-bin
log-slave-updates                #很重要,从前一台机器上同步过来的数据才能同步到下一台机器 
expire_logs_days        = 10 
max_binlog_size         = 100M 
auto_increment_offset    = 2 
auto_increment_increment = 2

3)mdb1和mdb2: 
重启mysql 
/etc/init.d/mysql restart
添加复制用户 
mysql -uroot -pgaojinbo.com 
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.5.%’ IDENTIFIED BY ‘gaojinbo’;
记录日志文件和pos 
mysql -uroot -pgaojinbo.com 
show master status\G


4)mdb1: 
change master to master_host=’192.168.5.12′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000003′,master_log_pos=106; 
start slave; 
show slave status\G 
说明:mysql-bin.000003和106是主库配置第3)步记录的信息
出现以下内容,说明同步ok 
           Slave_IO_Running: Yes 
          Slave_SQL_Running: Yes

5)mdb2: 
change master to master_host=’192.168.5.11′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000001′,master_log_pos=249; 
start slave; 
show slave status\G 
说明:mysql-bin.000001和249是主库配置第3)步记录的信息
出现以下内容,说明同步ok 
           Slave_IO_Running: Yes 
          Slave_SQL_Running: Yes


6)测试主-主同步 
mdb1: 
mysql -uroot -pgaojinbo.com 
show databases; 
create database gaojinbo;
mdb2: 
mysql -uroot -pgaojinbo.com 
show databases; 
即可看到在mdb1上建立的数据库gaojinbo

至此mdb1,mdb2主-主配置完成!


5.4台从库配置 
sdb1-4配置(注:server-id不能相同): 
vi /etc/mysql/my.cnf 
server-id               = 3 
log_bin                 = mysql-bin
重启mysql 
/etc/init.d/mysql restart

sdb1和sdb2配置成mdb1的从库: 
mysql -uroot -pgaojinbo.com 
change master to master_host=’192.168.5.11′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000001′,master_log_pos=345; 
start slave; 
show slave status\G 
说明:mysql-bin.000001和345是主库配置第3)步记录的信息
出现以下内容,说明同步ok 
          Slave_IO_Running: Yes 
          Slave_SQL_Running: Yes

sdb3和sdb4配置成mdb2的从库: 
change master to master_host=’192.168.5.12′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000003′,master_log_pos=106; 
start slave; 
show slave status\G 
说明:mysql-bin.000003和106是主库配置第3)步记录的信息
出现以下内容,说明同步ok 
          Slave_IO_Running: Yes 
          Slave_SQL_Running: Yes

测试: 
mdb1: 
mysql -uroot -pgaojinbo.com 
show databases; 
create database eossc;
在其他DB上,这时会看到刚建立的数据库eossc

至此4台从数据库配置完成!

6.编写mysql检测脚本 
1)mdb1和mdb2: 
vi /etc/xinetd.d/mysqlchk 

# /etc/xinetd.d/mysqlchk 

service mysqlchk_write 

        flags           = REUSE 
        socket_type     = stream 
        port            = 9200 
        wait            = no 
        user            = nobody 
        server          = /opt/mysqlchk_status.sh 
        log_on_failure  += USERID 
        disable         = no 
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need 
                                    # to connect exclusively (security purposes) 

  
service mysqlchk_replication 

        flags           = REUSE 
        socket_type     = stream 
        port            = 9201 
        wait            = no 
        user            = nobody 
        server          = /opt/mysqlchk_replication.sh 
        log_on_failure  += USERID 
        disable         = no 
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need 
                                    # to connect exclusively (security purposes) 
}
添加服务端口 
vi /etc/services 
mysqlchk_write      9200/tcp                #mysqlchk_write 
mysqlchk_replication    9201/tcp                #mysqlchk_replication
mdb1上操作: 
vi /opt/mysqlchk_status.sh 
#!/bin/bash
MYSQL_HOST="192.168.5.11" 
MYSQL_PORT="3306" 
MYSQL_USERNAME="root" 
MYSQL_PASSWORD="gaojinbo.com" 
  
  
ERROR_MSG=`/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show databases;" 2>/dev/null` 
  
if [ "$ERROR_MSG" != "" ] 
then 
        # mysql is fine, return http 200 
        /bin/echo -e "HTTP/1.1 200 OK\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL is running.\r\n" 
        /bin/echo -e "\r\n" 
else 
        # mysql is down, return http 503 
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL is *down*.\r\n" 
        /bin/echo -e "\r\n" 
fi
vi /opt/mysqlchk_replication.sh 
#!/bin/bash
MYSQL_HOST="192.168.5.11" 
MYSQL_PORT="3306" 
MYSQL_USERNAME="root" 
MYSQL_PASSWORD="gaojinbo.com" 
  
  
/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show slave status\G;" >/tmp/check_repl.txt
iostat=`grep "Slave_IO_Running" /tmp/check_repl.txt |awk ‘{print $2}’ ` 
sqlstat=`grep "Slave_SQL_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `
#echo iostat:$iostat and sqlstat:$sqlstat
if [ "$iostat" = "No" ] || [ "$sqlstat" = "No" ]; 
then 
        # mysql is down, return http 503 
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL replication  is *down*.\r\n" 
        /bin/echo -e "\r\n" 
else 
        # mysql is fine, return http 200 
        /bin/echo -e "HTTP/1.1 200 OK\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL replication is running.\r\n" 
        /bin/echo -e "\r\n" 
fi
测试同步检测脚本: 
mysql -uroot -pgaojinbo.com 
stop slave sql_thread; #或者  stop slave io_thread;
/opt/mysqlchk_replication.sh
mdb2上操作: 
添加和mdb1一样的脚本,把 
/opt/mysqlchk_status.sh        里面的192.168.5.11修改为192.168.5.12 
/opt/mysqlchk_replication.sh    里面的192.168.5.11修改为192.168.5.12

2)sdb1,sdb2,sdb3,sdb4上操作: 
vi /etc/xinetd.d/mysqlchk 

# /etc/xinetd.d/mysqlchk 

  
service mysqlchk_replication 

        flags           = REUSE 
        socket_type     = stream 
        port            = 9201 
        wait            = no 
        user            = nobody 
        server          = /opt/mysqlchk_replication.sh 
        log_on_failure  += USERID 
        disable         = no 
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need 
                                    # to connect exclusively (security purposes) 
}
vi /opt/mysqlchk_replication.sh 
#!/bin/bash
MYSQL_HOST="192.168.5.21" 
MYSQL_PORT="3306" 
MYSQL_USERNAME="root" 
MYSQL_PASSWORD="gaojinbo.com" 
  
  
/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show slave status\G;" >/tmp/check_repl.txt
iostat=`grep "Slave_IO_Running" /tmp/check_repl.txt |awk ‘{print $2}’ ` 
sqlstat=`grep "Slave_SQL_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `
#echo iostat:$iostat and sqlstat:$sqlstat
if [ "$iostat" = "No" ] || [ "$sqlstat" = "No" ]; 
then 
        # mysql is down, return http 503 
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL replication  is *down*.\r\n" 
        /bin/echo -e "\r\n" 
else 
        # mysql is fine, return http 200 
        /bin/echo -e "HTTP/1.1 200 OK\r\n" 
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n" 
        /bin/echo -e "\r\n" 
        /bin/echo -e "MySQL replication is running.\r\n" 
        /bin/echo -e "\r\n" 
fi
注:脚本/opt/mysqlchk_replication.sh里面的ip 
sdb1    MYSQL_HOST="192.168.5.21" 
sdb2    MYSQL_HOST="192.168.5.22" 
sdb3    MYSQL_HOST="192.168.5.23" 
sdb4    MYSQL_HOST="192.168.5.24"
添加服务端口 
vi /etc/services 
mysqlchk_replication    9201/tcp                #mysqlchk_replication

3)所有DB上操作: 
增加检测脚本执行权限 
chmod +x /opt/mysql*.sh
重启系统 
reboot
查看监听端口 
netstat -antup|grep xinetd 
tcp        0      0 0.0.0.0:9200            0.0.0.0:*               LISTEN      903/xinetd      
tcp        0      0 0.0.0.0:9201            0.0.0.0:*               LISTEN      903/xinetd
注:sdb只有9201监听

7.haproxy安装配置 
下载编译安装: 
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.11.tar.gz 
tar xvzf haproxy-1.4.11.tar.gz 
cd haproxy-1.4.11 
make TARGET=linux26 ARCH=x86_64 
make install

配置 
vi /etc/haproxy.cfg
global 
        maxconn 40000 
        debug 
        #quiet 
        user haproxy 
        group haproxy 
        nbproc 1 
        log 127.0.0.1 local3 
        spread-checks 2 
defaults 
         timeout server  3s 
         timeout connect 3s 
         timeout client  60s 
         timeout http-request 3s 
         timeout queue   3s
frontend db_write 
        bind 192.168.5.10:3306 
        default_backend cluster_db_write
frontend db_read 
        bind 192.168.5.20:3306 
        default_backend cluster_db_read
frontend web_haproxy_status 
        bind :80 
        default_backend web_status
frontend monitor_mdb1 
        bind 127.0.0.1:9301 
        mode http 
        acl no_repl_mdb1 nbsrv(mdb1_replication) eq 0 
        acl no_repl_mdb2 nbsrv(mdb2_replication) eq 0 
        acl no_mdb1 nbsrv(mdb1_status) eq 0 
        acl no_mdb2 nbsrv(mdb2_status) eq 0 
        monitor-uri /dbs 
        monitor fail unless no_repl_mdb1 no_repl_mdb2 no_mdb2 
        monitor fail if no_mdb1 no_mdb2
frontend monitor_mdb2 
        bind 127.0.0.1:9302 
        mode http 
        acl no_repl_mdb1 nbsrv(mdb1_replication) eq 0 
        acl no_repl_mdb2 nbsrv(mdb2_replication) eq 0 
        acl no_mdb1 nbsrv(mdb1_status) eq 0 
        acl no_mdb2 nbsrv(mdb2_status) eq 0 
        monitor-uri /dbs 
        monitor fail unless no_repl_mdb1 no_repl_mdb2 no_mdb1 
        monitor fail if no_mdb1 no_mdb2
frontend monitor_sdb1 
        bind 127.0.0.1:9303 
        mode http 
        acl no_repl_sdb1 nbsrv(sdb1_replication) eq 0 
        acl no_repl_mdb1 nbsrv(mdb1_replication) eq 0 
        acl no_mdb2 nbsrv(mdb2_status) eq 1 
        monitor-uri /dbs 
        monitor fail if no_repl_sdb1 
        monitor fail if no_repl_mdb1 no_mdb2
frontend monitor_sdb2 
        bind 127.0.0.1:9304 
        mode http 
        acl no_repl_sdb2 nbsrv(sdb2_replication) eq 0 
        acl no_repl_mdb1 nbsrv(mdb1_replication) eq 0 
        acl no_mdb2 nbsrv(mdb2_status) eq 1 
        monitor-uri /dbs 
        monitor fail if no_repl_sdb2 
        monitor fail if no_repl_mdb1 no_mdb2
frontend monitor_sdb3 
        bind 127.0.0.1:9305 
        mode http 
        acl no_repl_sdb3 nbsrv(sdb3_replication) eq 0 
        acl no_repl_mdb2 nbsrv(mdb2_replication) eq 0 
        acl no_mdb1 nbsrv(mdb1_status) eq 1 
        monitor-uri /dbs 
        monitor fail if no_repl_sdb3 
        monitor fail if no_repl_mdb2 no_mdb1
frontend monitor_sdb4 
        bind 127.0.0.1:9306 
        mode http 
        acl no_repl_sdb4 nbsrv(sdb4_replication) eq 0 
        acl no_repl_mdb2 nbsrv(mdb2_replication) eq 0 
        acl no_mdb1 nbsrv(mdb1_status) eq 1 
        monitor-uri /dbs 
        monitor fail if no_repl_sdb4 
        monitor fail if no_repl_mdb2 no_mdb1
frontend monitor_splitbrain 
        bind 127.0.0.1:9300 
        mode http 
        acl no_repl01 nbsrv(mdb1_replication) eq 0 
        acl no_repl02 nbsrv(mdb2_replication) eq 0 
        acl mdb1 nbsrv(mdb1_status) eq 1 
        acl mdb2 nbsrv(mdb2_status) eq 1 
        monitor-uri /dbs 
        monitor fail unless no_repl01 no_repl02 mdb1 mdb2
backend mdb1_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server mdb1 192.168.5.11:3306 check port 9201 inter 1s rise 1 fall 1 
  
backend mdb2_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server mdb2 192.168.5.12:3306 check port 9201 inter 1s rise 1 fall 1
backend sdb1_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server sdb1 192.168.5.21:3306 check port 9201 inter 1s rise 1 fall 1
backend sdb2_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server sdb2 192.168.5.22:3306 check port 9201 inter 1s rise 1 fall 1
backend sdb3_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server sdb3 192.168.5.23:3306 check port 9201 inter 1s rise 1 fall 1
backend sdb4_replication 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server sdb4 192.168.5.24:3306 check port 9201 inter 1s rise 1 fall 1
backend mdb1_status 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server mdb1 192.168.5.11:3306 check port 9200 inter 1s rise 2 fall 2 
  
backend mdb2_status 
        mode tcp 
        balance roundrobin 
        option tcpka 
        option httpchk 
        server mdb2 192.168.5.12:3306 check port 9200 inter 1s rise 2 fall 2
backend cluster_db_write 
        mode    tcp 
        option  tcpka 
        balance roundrobin 
        option  httpchk GET /dbs 
        server  mdb1 192.168.5.11:3306 weight 1 check port 9201 inter 1s rise 5 fall 1 
        server  mdb2 192.168.5.12:3306 weight 1 check port 9201 inter 1s rise 5 fall 1 backup 
        server  mdb1_backup 192.168.5.11:3306 weight 1 check port 9301 inter 1s rise 2 fall 2 addr 127.0.0.1 backup 
        server  mdb2_backup 192.168.5.12:3306 weight 1 check port 9302 inter 1s rise 2 fall 2 addr 127.0.0.1 backup
backend cluster_db_read 
        mode    tcp 
        option  tcpka 
        balance roundrobin 
        option  httpchk GET /dbs 
        server  mdb1 192.168.5.11:3306 weight 1 track cluster_db_write/mdb1 
        server  mdb2 192.168.5.12:3306 weight 1 track cluster_db_write/mdb2 
        server  mdb1_backup 192.168.5.11:3306 weight 1 track cluster_db_write/mdb1_backup 
        server  mdb2_backup 192.168.5.12:3306 weight 1 track cluster_db_write/mdb2_backup 
        server  mdb1_splitbrain 192.168.5.11:3306 weight 1 check port 9300 inter 1s rise 1 fall 2 addr 127.0.0.1 
        server  mdb2_splitbrain 192.168.5.12:3306 weight 1 check port 9300 inter 1s rise 1 fall 2 addr 127.0.0.1
        server  sdb1_slave 192.168.5.21:3306 weight 1 check port 9303 inter 1s rise 5 fall 1 addr 127.0.0.1 
        server  sdb2_slave 192.168.5.22:3306 weight 1 check port 9304 inter 1s rise 5 fall 1 addr 127.0.0.1 
        server  sdb3_slave 192.168.5.23:3306 weight 1 check port 9305 inter 1s rise 5 fall 1 addr 127.0.0.1 
        server  sdb4_slave 192.168.5.24:3306 weight 1 check port 9306 inter 1s rise 5 fall 1 addr 127.0.0.1

backend  web_status 
         mode http 
         stats enable 
       # stats scope 
       # stats hide-version 
         stats refresh 5s 
         stats uri /status 
         stats realm Haproxy\ statistics 
         stats auth ylmf:gaojinbo


8.测试
1)正常情况,backup和splitbrain状态down
Highslide JS

2)停止mdb2复制,mdb2和sdb3,sdb4状态down,数据库仍可读写
Highslide JS

3)同时停止mdb1,mdb2复制,mdb1和sdb1,sdb2,sdb3,sdb4状态down,数据库只能读
Highslide JS

4)关闭mdb1数据库,mdb1,mdb2和sdb1,sdb2状态down,数据库仍可读写

Highslide JS
5)关闭mdb2数据库,mdb1,mdb2和sdb3,sdb4状态down,数据库仍可读写
Highslide JS



http://chatgpt.dhexx.cn/article/DANq5JiM.shtml

相关文章

负载均衡-

常见的负载均衡系统包括 3 种:DNS 负载均衡、硬件负载均衡和软件负载均衡。 DNS 负载均衡 DNS 是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。例如,北方的用户访问北京的机房,南方的用户访问深圳的机房。DNS 负…

负载均衡的解决方案

负载均衡的解决方案 前言 我们在设计分布式系统的时候往往需要考虑系统的伸缩性,这里所说的伸缩性指的是我们可以通过添加服务器节点的方式来提升我们整个系统的并发能力,这种提高伸缩性的基础原理其实就是我们所说的——负载均衡。 正文 负载均衡 …

负载均衡及解决方案

目录 一、什么是负载均衡? 二、负载均衡方案有几种? 1、基于DNS负载均衡 2、基于硬件负载均衡 3、基于软件负载均衡 三、常用的均衡算法有哪些? 1、轮询策略 2、负载度策略 3、响应策略 4、哈希策略 一、什么是负载均衡?…

吃透这份Github点赞120k的Spring全家桶笔记Offer拿到手软

Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。它包SpringMVC、SpringBoot、Spring Cloud、Spring Data等解决方案。 很多研发人员把spring看作心目中最好的java项目,没有之一。Spring系列包含非常多的项目&…

分布式事务及解决方案

1、分布式事务 分布式事务就是在一个交易中各个服务之间的相互调用必须要同时成功或者同时失败,保持一致性和可靠性。在单体项目架构中,在多数据源的情况下也会发生 分布式事务问题。本质上来说,分布式事务就是为了保证不同数据库的数据一致性…

负载均衡方案

负载均衡方案 1、负载均衡概念 一台普通服务器的处理能力是有限的,假如能达到每秒几万个到几十万个请求,但却无法在一秒钟内处理上百万个甚至更多的请求。但若能将多台这样的服务器组成一个系统,并通过软件技术将所有请求平均分配给所有服务…

负载均衡的多种解决方案

以下为原文 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层…

信息熵笔记

观察两个事件同时发生时获得的信息量应该等于观察到事件各自发生时获得的信息之和? 两个事件的信息量之和等于两个事件和的信息量? 两个随机变量熵的和大于两个随机变量和的熵 图片引自:https://blog.csdn.net/luoxuexiong/article/details/…

一文弄懂信息熵

引言 今天我们来探讨一下信息熵是怎么来的。 信息熵 信息的价值在于消除事件的不确定性,那事件的不确定性要怎么度量呢?答案就是信息熵(information entropy)。 比如你告诉别人你中了500万彩票,别人会大吃一惊,因为他被消除了…

信息熵 entropy

熵 最早是由热力学定义的一个函数,是普朗克来中国讲学的时候引入的。英文是“entropy”这个字,中文词汇中没有相关的字眼。当时是一个有名的姓胡的学者作为普朗克的翻译。因为这个熵“S”是定义为热量Q与温度的比值,所以当时他翻译是立刻创造…

信息熵学习笔记

简介 在信息论中,熵(entropy)是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。 熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。 比较不可能发生的事情&…

信息熵到底是什么

信息是我们一直在谈论的东西,但信息这个概念本身依然比较抽象。在百度百科中的定义:信息,泛指人类社会传播的一切内容,指音讯、消息、通信系统传输和处理的对象。 但信息可不可以被量化,怎样量化?答案当然…

什么是信息熵

熵 当一件事情(宏观态)有多种可能情况(微观态)时,这件事情(宏观态)对某人(观察者)而言具体是哪种情况(微观态)的不确定性叫做熵(entropy&#xff…

信息熵是什么

信息熵是什么 通过前两节的学习,我们对于决策树算法有了大体的认识,本节我们将从数学角度解析如何选择合适的“特征做为判别条件”,这里需要重点掌握“信息熵”的相关知识。 信息熵这一概念由克劳德香农于1948 年提出。香农是美国著名的数学…

单选按钮html图片,js实现的 图片单选按钮效果

【实例简介】用js实现的radio图片选择按钮效果。 【实例截图】 【核心代码】 用JS实现的radio图片选择按钮效果-脚本之家 .lanrentuku img{border:1px solid #008800;} function myFun(sId) { var oImg document.getElementsByTagName(img); for (var i 0; i < oImg.lengt…

html自定义单选按钮,美化表单——自定义单选按钮和复选按钮

大家都知道&#xff0c;在Web的Form中美化是最头痛的&#xff0c;尤其是表单中的“input[typecheckbox]”、“input[type"radio"]”、“input[typefile]”和select这些元素我们单单只使用CSS是无法匹配设计图的&#xff0c;像背景颜色或者背景图片&#xff0c;甚至说…

Android开发单选按钮功能,android实现单选按钮功能

在我们平时在注册个人信息的时候,经常会让我们选择是男生还是女生,那么这个单选框在Android中是怎么实现的呢?现在我们就来学习一下吧 首先我们要明白实现这样一个效果需要哪几部? 1、在layout布局文件中建立一个文件,我起的名字为activity_radio.xml 代码为: android:la…

单选按钮RadioButton

效果示例&#xff1a; MRadioButton.h //******************************************************** /// brief 自定义单选按钮 /// author y974183789gmail.com /// date 2021/9/18 /// note 支持自定义设置单选指示器位置 /// version 1.0.0 //***************************…

单选按钮(RadioButton)与 复选框(CheckBox)的功能与 用法

按照惯例&#xff0c;先看看两者的区别&#xff1a; 顾名思义&#xff0c;单选俺就就是只能选中一项的&#xff0c;而复选框是可以多选的。 一般来说&#xff0c;单选按钮是用于只有唯一答案的问题的答案选项中&#xff0c;而复选框用于一些可以多选的问题的答案中。 下面看看…

Android——单选多选按钮的使用详解

一&#xff1a;单选按钮 单选按钮类&#xff1a;RadioButton android&#xff1a;checked"true"设置默认选中 单选按钮控件通常与RadioGroup搭配使用。 RadioGroup是LinearLayout的子类&#xff0c;用于将多个单选按钮组合为一组。 同一按钮组内的单选…