FreeSWITCH 异常重启后会话快速恢复

FreeSWITCH 异常重启后会话快速恢复

配置

会话追踪

sip_profiles/*.xml

<param name="track-calls" value="true"/>

(官方文档描述会有轻微性能影响)

存储恢复数据、修改数据库位置

重要

fs默认使用sqlite进行恢复数据的存储,也可以正常使用,但此处改为odbc,使得数据易见。

autoload_configs/switch.conf.xml

<param name="core-db-dsn" value="odbc://dsn:用户名:密码"/>

本质是将会话信息存储到数据库,恢复时读取关键信息用以恢复。

表名:recovery

例:

表数据一览:

image

关键信息:

<cdr core-uuid="7f083c47-c818-44f4-97c7-17a7a1a09066" switchname="localhost.localdomain">
  <channel_data>
    <state>CS_CONSUME_MEDIA</state>
    <direction>outbound</direction>
    <state_number>7</state_number>
    <flags>0=1;1=1;2=1;22=1;26=1;39=1;45=1;46=1;50=1;55=1;59=1;88=1;89=1;100=1;107=1;113=1;114=1;143=1;160=1;166=1</flags>
    <caps>1=1;2=1;3=1;4=1;5=1;6=1;8=1;9=1;10=1</caps>
  </channel_data>
  <call-stats>
    <audio>
      <inbound>
        <raw_bytes>0</raw_bytes>
        <media_bytes>0</media_bytes>
        <packet_count>0</packet_count>
        <media_packet_count>0</media_packet_count>
        <skip_packet_count>0</skip_packet_count>
        <jitter_packet_count>0</jitter_packet_count>
        <dtmf_packet_count>0</dtmf_packet_count>
        <cng_packet_count>0</cng_packet_count>
        <flush_packet_count>0</flush_packet_count>
        <largest_jb_size>0</largest_jb_size>
        <jitter_min_variance>0.00</jitter_min_variance>
        <jitter_max_variance>0.00</jitter_max_variance>
        <jitter_loss_rate>0.00</jitter_loss_rate>
        <jitter_burst_rate>0.00</jitter_burst_rate>
        <mean_interval>0.00</mean_interval>
        <flaw_total>0</flaw_total>
        <quality_percentage>100.00</quality_percentage>
        <mos>4.50</mos>
      </inbound>
      <outbound>
        <raw_bytes>0</raw_bytes>
        <media_bytes>0</media_bytes>
        <packet_count>0</packet_count>
        <media_packet_count>0</media_packet_count>
        <skip_packet_count>0</skip_packet_count>
        <dtmf_packet_count>0</dtmf_packet_count>
        <cng_packet_count>0</cng_packet_count>
        <rtcp_packet_count>0</rtcp_packet_count>
        <rtcp_octet_count>0</rtcp_octet_count>
      </outbound>
    </audio>
    <video>
      <inbound>
        <raw_bytes>0</raw_bytes>
        <media_bytes>0</media_bytes>
        <packet_count>0</packet_count>
        <media_packet_count>0</media_packet_count>
        <skip_packet_count>1</skip_packet_count>
        <jitter_packet_count>0</jitter_packet_count>
        <dtmf_packet_count>0</dtmf_packet_count>
        <cng_packet_count>0</cng_packet_count>
        <flush_packet_count>0</flush_packet_count>
        <largest_jb_size>0</largest_jb_size>
        <jitter_min_variance>0.00</jitter_min_variance>
        <jitter_max_variance>0.00</jitter_max_variance>
        <jitter_loss_rate>0.00</jitter_loss_rate>
        <jitter_burst_rate>0.00</jitter_burst_rate>
        <mean_interval>0.00</mean_interval>
        <flaw_total>0</flaw_total>
        <quality_percentage>100.00</quality_percentage>
        <mos>4.50</mos>
      </inbound>
      <outbound>
        <raw_bytes>1030</raw_bytes>
        <media_bytes>1030</media_bytes>
        <packet_count>7</packet_count>
        <media_packet_count>7</media_packet_count>
        <skip_packet_count>0</skip_packet_count>
        <dtmf_packet_count>0</dtmf_packet_count>
        <cng_packet_count>0</cng_packet_count>
        <rtcp_packet_count>0</rtcp_packet_count>
        <rtcp_octet_count>0</rtcp_octet_count>
      </outbound>
    </video>
  </call-stats>
  <variables>
    <direction>outbound</direction>
    <is_outbound>true</is_outbound>
    <uuid>8dc21c06-a91c-467a-88c5-fd0a5dafa406</uuid>
    <session_id>5</session_id>
    <sip_profile_name>internal-video</sip_profile_name>
    <sip_destination_url>sip%3A990005%40192.168.4.18%3A55867%3Btransport%3Dudp%3Bfs_nat%3Dyes%3Bfs_path%3Dsip%3A990005%40192.168.4.18%3A55867%3Btransport%3Dudp</sip_destination_url>
    <dialed_user>990005</dialed_user>
    <dialed_domain>192.168.2.22</dialed_domain>
    <sip_invite_domain>192.168.2.22</sip_invite_domain>
    <presence_id>990005%40192.168.2.22</presence_id>
    <sip_nat_detected>true</sip_nat_detected>
    <sofia_profile_name>internal-video</sofia_profile_name>
    <recovery_profile_name>internal-video</recovery_profile_name>
    <sofia_profile_url>sip%3Amod_sofia%40192.168.2.22%3A5060</sofia_profile_url>
    <endpoint_disposition>ANSWER</endpoint_disposition>
    <record_stereo>true</record_stereo>
    <default_gateway>example.com</default_gateway>
    <default_areacode>918</default_areacode>
    <transfer_fallback_extension>operator</transfer_fallback_extension>
    <toll_allow>domestic,international,local</toll_allow>
    <accountcode>990005</accountcode>
    <user_context>default</user_context>
    <outbound_caller_id_name>FreeSWITCH</outbound_caller_id_name>
    <outbound_caller_id_number>0000000000</outbound_caller_id_number>
    <callgroup>techsupport</callgroup>
    <max_forwards>68</max_forwards>
    <originator_video_codec>H264%4090000h%400i</originator_video_codec>
    <originator_codec>G729%408000h%4020i,H264%4090000h%400i</originator_codec>
    <originator>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</originator>
    <export_vars>RFC2822_DATE</export_vars>
    <RFC2822_DATE>Mon,%2024%20Mar%202025%2015%3A18%3A32%20%2B0800</RFC2822_DATE>
    <originate_early_media>true</originate_early_media>
    <originating_leg_uuid>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</originating_leg_uuid>
    <originate_endpoint>user</originate_endpoint>
    <recovered>true</recovered>
    <sip_handle_full_from>%22990003%22%20%3Csip%3A990003%40192.168.2.22%3E%3Btag%3Da1ctQKmK945jS</sip_handle_full_from>
    <sip_handle_full_to>%3Csip%3A990005%40192.168.4.18%3A55867%3Btransport%3Dudp%3E%3Btag%3DeFcJB51</sip_handle_full_to>
    <video_media_flow>disabled</video_media_flow>
    <text_media_flow>disabled</text_media_flow>
    <channel_name>sofia/internal-video/990005%40192.168.4.18%3A55867</channel_name>
    <sip_invite_call_id>8dc21c06-a91c-467a-88c5-fd0a5dafa406</sip_invite_call_id>
    <sip_route_uri>sip%3A(null)%40192.168.4.18%3A55867</sip_route_uri>
    <rtp_use_codec_name>G729</rtp_use_codec_name>
    <rtp_use_codec_fmtp>annexb%3Dyes</rtp_use_codec_fmtp>
    <rtp_use_codec_rate>8000</rtp_use_codec_rate>
    <rtp_use_codec_ptime>20</rtp_use_codec_ptime>
    <rtp_use_codec_channels>1</rtp_use_codec_channels>
    <rtp_last_audio_codec_string>G729%408000h%4020i%401c</rtp_last_audio_codec_string>
    <read_codec>G729</read_codec>
    <original_read_codec>G729</original_read_codec>
    <read_rate>8000</read_rate>
    <original_read_rate>8000</original_read_rate>
    <write_codec>G729</write_codec>
    <write_rate>8000</write_rate>
    <audio_media_flow>sendrecv</audio_media_flow>
    <video_read_codec>H264</video_read_codec>
    <video_read_rate>90000</video_read_rate>
    <video_write_codec>H264</video_write_codec>
    <video_write_rate>90000</video_write_rate>
    <rtp_last_video_codec_string>H264%4090000h</rtp_last_video_codec_string>
    <rtp_use_video_codec_name>H264</rtp_use_video_codec_name>
    <rtp_use_video_codec_fmtp>profile-level-id%3D42801F</rtp_use_video_codec_fmtp>
    <rtp_use_video_codec_rate>90000</rtp_use_video_codec_rate>
    <rtp_use_video_codec_ptime>0</rtp_use_video_codec_ptime>
    <local_media_ip>192.168.2.22</local_media_ip>
    <local_media_port>16496</local_media_port>
    <advertised_media_ip>192.168.2.22</advertised_media_ip>
    <rtp_use_timer_name>soft</rtp_use_timer_name>
    <rtp_use_pt>18</rtp_use_pt>
    <rtp_use_ssrc>1476670368</rtp_use_ssrc>
    <rtp_2833_send_payload>101</rtp_2833_send_payload>
    <rtp_2833_recv_payload>101</rtp_2833_recv_payload>
    <local_video_ip>192.168.2.22</local_video_ip>
    <local_video_port>29646</local_video_port>
    <rtp_use_video_pt>102</rtp_use_video_pt>
    <rtp_use_video_ssrc>605291748</rtp_use_video_ssrc>
    <rtp_local_sdp_str>v%3D0%0D%0Ao%3DFocustarCC%201742784243%201742784245%20IN%20IP4%20192.168.2.22%0D%0As%3DFocustarCC%0D%0Ac%3DIN%20IP4%20192.168.2.22%0D%0At%3D0%200%0D%0Am%3Daudio%2016496%20RTP/AVP%2018%20101%0D%0Aa%3Drtpmap%3A18%20G729/8000%0D%0Aa%3Dfmtp%3A18%20annexb%3Dno%0D%0Aa%3Drtpmap%3A101%20telephone-event/0%0D%0Aa%3Dfmtp%3A101%200-15%0D%0Aa%3Dptime%3A20%0D%0Aa%3Dsendrecv%0D%0Am%3Dvideo%2029646%20RTP/AVP%20102%0D%0Ab%3DAS%3A3072%0D%0Aa%3Drtpmap%3A102%20H264/90000%0D%0Aa%3Dfmtp%3A102%20profile-level-id%3D42801F%0D%0Aa%3Drtcp-fb%3A102%20ccm%20fir%0D%0Aa%3Drtcp-fb%3A102%20ccm%20tmmbr%0D%0Aa%3Drtcp-fb%3A102%20nack%0D%0Aa%3Drtcp-fb%3A102%20nack%20pli%0D%0A</rtp_local_sdp_str>
    <sip_outgoing_contact_uri>%3Csip%3A990005%40192.168.2.22%3A5060%3E</sip_outgoing_contact_uri>
    <sip_req_uri>990005%40192.168.4.18%3A55867%3Btransport%3Dudp</sip_req_uri>
    <sip_local_network_addr>192.168.2.22</sip_local_network_addr>
    <sip_reply_host>192.168.4.18</sip_reply_host>
    <sip_reply_port>55867</sip_reply_port>
    <sip_network_ip>192.168.4.18</sip_network_ip>
    <sip_network_port>55867</sip_network_port>
    <sip_user_agent>Linphone-Desktop/5.2.6%20(work)%20windows/10%20Qt/5.15.2%20LinphoneSDK/5.3.72</sip_user_agent>
    <sip_allow>INVITE,%20ACK,%20CANCEL,%20OPTIONS,%20BYE,%20REFER,%20NOTIFY,%20MESSAGE,%20SUBSCRIBE,%20INFO,%20PRACK,%20UPDATE</sip_allow>
    <sip_recover_contact>%3Csip%3A990005%40192.168.4.18%3A55867%3Btransport%3Dudp%3E%3Bexpires%3D60%3B%2Borg.linphone.specs%3D%22lime%22</sip_recover_contact>
    <sip_full_via>SIP/2.0/UDP%20192.168.2.22%3Brport%3Bbranch%3Dz9hG4bKvZ89jcXZ9ejZH</sip_full_via>
    <sip_recover_via>SIP/2.0/UDP%20192.168.2.22%3Brport%3Bbranch%3Dz9hG4bKvZ89jcXZ9ejZH</sip_recover_via>
    <sip_from_display>990003</sip_from_display>
    <sip_full_from>%22990003%22%20%3Csip%3A990003%40192.168.2.22%3E%3Btag%3Da1ctQKmK945jS</sip_full_from>
    <sip_full_to>%3Csip%3A990005%40192.168.4.18%3A55867%3Btransport%3Dudp%3E%3Btag%3DeFcJB51</sip_full_to>
    <sip_from_user>990003</sip_from_user>
    <sip_from_uri>990003%40192.168.2.22</sip_from_uri>
    <sip_from_host>192.168.2.22</sip_from_host>
    <sip_to_params>transport%3Dudp</sip_to_params>
    <sip_to_user>990005</sip_to_user>
    <sip_to_port>55867</sip_to_port>
    <sip_to_uri>990005%40192.168.4.18%3A55867</sip_to_uri>
    <sip_to_host>192.168.4.18</sip_to_host>
    <sip_contact_params>transport%3Dudp</sip_contact_params>
    <sip_contact_user>990005</sip_contact_user>
    <sip_contact_port>55867</sip_contact_port>
    <sip_contact_uri>990005%40192.168.4.18%3A55867</sip_contact_uri>
    <sip_contact_host>192.168.4.18</sip_contact_host>
    <sip_to_tag>eFcJB51</sip_to_tag>
    <sip_from_tag>a1ctQKmK945jS</sip_from_tag>
    <sip_cseq>96846577</sip_cseq>
    <sip_call_id>8dc21c06-a91c-467a-88c5-fd0a5dafa406</sip_call_id>
    <switch_r_sdp>v%3D0%0D%0Ao%3D990005%203440%20498%20IN%20IP4%20172.16.100.124%0D%0As%3DTalk%0D%0Ac%3DIN%20IP4%20172.16.100.124%0D%0At%3D0%200%0D%0Am%3Daudio%207078%20RTP/AVP%2018%0D%0Aa%3Dfmtp%3A18%20annexb%3Dyes%0D%0Aa%3Dsendrecv%0D%0Am%3Dvideo%209078%20RTP/AVP%20102%0D%0Aa%3Drtpmap%3A102%20H264/90000%0D%0Aa%3Dfmtp%3A102%20profile-level-id%3D42801F%0D%0Aa%3Dsendrecv%0D%0Aa%3Drtcp-fb%3A*%20trr-int%201000%0D%0Aa%3Drtcp-fb%3A*%20nack%0D%0Aa%3Drtcp-fb%3A*%20ccm%20tmmbr%0D%0Aa%3Drtcp-fb%3A102%20nack%20pli%0D%0Aa%3Drtcp-fb%3A102%20ccm%20fir%0D%0A</switch_r_sdp>
    <ep_codec_string>mod_bcg729.G729%408000h%4020i%408000b,mod_av.H264~profile-level-id%3D42801F</ep_codec_string>
    <rtp_use_codec_string>G729%408000h%4020i,H264%4090000h%400i,PCMA,PCMU,G729,VP8,H264</rtp_use_codec_string>
    <remote_text_media_flow>inactive</remote_text_media_flow>
    <remote_audio_media_flow>sendrecv</remote_audio_media_flow>
    <remote_media_ip>172.16.100.124</remote_media_ip>
    <remote_media_port>7078</remote_media_port>
    <rtp_audio_recv_pt>18</rtp_audio_recv_pt>
    <dtmf_type>info</dtmf_type>
    <remote_video_media_flow>sendrecv</remote_video_media_flow>
    <video_possible>true</video_possible>
    <remote_video_ip>172.16.100.124</remote_video_ip>
    <remote_video_port>9078</remote_video_port>
    <rtp_video_fmtp>profile-level-id%3D42801F</rtp_video_fmtp>
    <rtp_video_pt>102</rtp_video_pt>
    <rtp_video_recv_pt>102</rtp_video_recv_pt>
    <rtp_remote_video_rtcp_port>9079</rtp_remote_video_rtcp_port>
    <bridge_channel>sofia/internal-video/990003%40192.168.2.22</bridge_channel>
    <bridge_uuid>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</bridge_uuid>
    <signal_bond>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</signal_bond>
    <original_destination_number>990005</original_destination_number>
    <original_caller_id_name>990003</original_caller_id_name>
    <original_caller_id_number>990003</original_caller_id_number>
    <transfer_history>1742800739%3A56fb6621-8f08-4cff-b350-c1dc53731a4f%3Auuid_br%3A5a4c45ba-6c22-4e21-bce8-fde0e06139f3</transfer_history>
    <transfer_source>1742800739%3A56fb6621-8f08-4cff-b350-c1dc53731a4f%3Auuid_br%3A5a4c45ba-6c22-4e21-bce8-fde0e06139f3</transfer_source>
    <switch_m_sdp>v%3D0%0D%0Ao%3D990003%202049%20942%20IN%20IP4%20192.168.2.24%0D%0As%3DTalk%0D%0Ac%3DIN%20IP4%20192.168.2.24%0D%0At%3D0%200%0D%0Am%3Daudio%2056067%20RTP/AVP%2018%0D%0Aa%3Dfmtp%3A18%20annexb%3Dyes%0D%0Aa%3Dsendrecv%0D%0Am%3Dvideo%2056069%20RTP/AVP%2096%0D%0Aa%3Drtpmap%3A96%20H264/90000%0D%0Aa%3Dfmtp%3A96%20profile-level-id%3D42801F%0D%0Aa%3Dsendrecv%0D%0Aa%3Drtcp-fb%3A*%20trr-int%201000%0D%0Aa%3Drtcp-fb%3A*%20nack%0D%0Aa%3Drtcp-fb%3A*%20ccm%20tmmbr%0D%0Aa%3Drtcp-fb%3A96%20nack%20pli%0D%0Aa%3Drtcp-fb%3A96%20ccm%20fir%0D%0A</switch_m_sdp>
    <call_uuid>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</call_uuid>
    <bridge_to>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</bridge_to>
    <last_bridge_to>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</last_bridge_to>
  </variables>
  <callflow dialplan="XML" unique-id="56fb6621-8f08-4cff-b350-c1dc53731a4f" clone-of="9f842aa3-92f3-4319-a55f-2c52b236b21f" profile_index="2">
    <caller_profile>
      <username>990003</username>
      <dialplan>XML</dialplan>
      <caller_id_name>990003</caller_id_name>
      <caller_id_number>990003</caller_id_number>
      <callee_id_name>Outbound Call</callee_id_name>
      <callee_id_number>990005</callee_id_number>
      <ani>990003</ani>
      <aniii></aniii>
      <network_addr>192.168.4.18</network_addr>
      <rdnis>990005</rdnis>
      <destination_number>990005</destination_number>
      <uuid>8dc21c06-a91c-467a-88c5-fd0a5dafa406</uuid>
      <source>mod_sofia</source>
      <transfer_source>1742800739:56fb6621-8f08-4cff-b350-c1dc53731a4f:uuid_br:5a4c45ba-6c22-4e21-bce8-fde0e06139f3</transfer_source>
      <context>default</context>
      <chan_name>sofia/internal-video/990005@192.168.4.18:55867</chan_name>
      <originator>
        <originator_caller_profile>
          <username>990003</username>
          <dialplan>XML</dialplan>
          <caller_id_name>990003</caller_id_name>
          <caller_id_number>990003</caller_id_number>
          <callee_id_name>Outbound Call</callee_id_name>
          <callee_id_number>990005</callee_id_number>
          <ani>990003</ani>
          <aniii></aniii>
          <network_addr>192.168.2.24</network_addr>
          <rdnis>990005</rdnis>
          <destination_number>990005</destination_number>
          <uuid>5a4c45ba-6c22-4e21-bce8-fde0e06139f3</uuid>
          <source>mod_sofia</source>
          <context>default</context>
          <chan_name>sofia/internal-video/990003@192.168.2.22</chan_name>
        </originator_caller_profile>
      </originator>
    </caller_profile>
    <times>
      <created_time>1742800739483601</created_time>
      <profile_created_time>1742800739571897</profile_created_time>
      <progress_time>1742800712911708</progress_time>
      <progress_media_time>0</progress_media_time>
      <answered_time>1742800716231627</answered_time>
      <bridged_time>1742800739611835</bridged_time>
      <last_hold_time>0</last_hold_time>
      <hold_accum_time>0</hold_accum_time>
      <hangup_time>0</hangup_time>
      <resurrect_time>0</resurrect_time>
      <transfer_time>0</transfer_time>
    </times>
  </callflow>
  <callflow dialplan="XML" unique-id="9f842aa3-92f3-4319-a55f-2c52b236b21f" profile_index="1">
    <caller_profile>
      <username>990003</username>
      <dialplan>XML</dialplan>
      <caller_id_name>990003</caller_id_name>
      <caller_id_number>990003</caller_id_number>
      <callee_id_name>Outbound Call</callee_id_name>
      <callee_id_number>990005</callee_id_number>
      <ani>990003</ani>
      <aniii></aniii>
      <network_addr>192.168.4.18</network_addr>
      <rdnis>990005</rdnis>
      <destination_number>990005</destination_number>
      <uuid>8dc21c06-a91c-467a-88c5-fd0a5dafa406</uuid>
      <source>mod_sofia</source>
      <context>default</context>
      <chan_name>sofia/internal-video/990005@192.168.4.18:55867</chan_name>
      <originator>
        <originator_caller_profile>
          <username>990003</username>
          <dialplan>XML</dialplan>
          <caller_id_name>990003</caller_id_name>
          <caller_id_number>990003</caller_id_number>
          <callee_id_name></callee_id_name>
          <callee_id_number></callee_id_number>
          <ani>990003</ani>
          <aniii></aniii>
          <network_addr>192.168.2.24</network_addr>
          <rdnis>990005</rdnis>
          <destination_number>990005</destination_number>
          <uuid></uuid>
          <source>mod_sofia</source>
          <context>default</context>
          <chan_name></chan_name>
        </originator_caller_profile>
      </originator>
    </caller_profile>
    <times>
      <created_time>1742800739483601</created_time>
      <profile_created_time>1742800712531680</profile_created_time>
      <progress_time>1742800712911708</progress_time>
      <progress_media_time>0</progress_media_time>
      <answered_time>1742800716231627</answered_time>
      <bridged_time>0</bridged_time>
      <last_hold_time>0</last_hold_time>
      <hold_accum_time>0</hold_accum_time>
      <hangup_time>0</hangup_time>
      <resurrect_time>1742800739483595</resurrect_time>
      <transfer_time>1742800739571897</transfer_time>
    </times>
  </callflow>
</cdr>


多节点配置

主从模式

配置主机与从机的switchname相同,当切换到从机时,确保从机ip与主机相同

autoload_configs/switch.conf.xml

<param name="switchname" value="freeswitch01"/>

多节点模式(分布式)

实测不同节点配置不同的switchname,另一个节点也会尝试恢复会话,当尝试恢复失败(bind ip 端口失败)时会将记录删除,可能会导致异常节点恢复时无法正常恢复会话。

暂不明确是设计还是缺陷。

暂不推荐在此模式下使用。


会话恢复

手动恢复

fs_cli -x 'sofia recover'
or
fs_cli -x 'fsctl recover'

fs启动时自动恢复

<X-PRE-PROCESS cmd="set" data="api_on_startup=fsctl recover"/>
or
<X-PRE-PROCESS cmd="set" data="api_on_startup=sofia recover"/>

结果验证

总共测试三项,echo,bridge,conference均能正常恢复会话,语音恢复较快,视频恢复较慢(与编解码相关,实际rtp恢复速度与语言相近)。

posted @ 2025-03-26 09:05  判空不判空  阅读(134)  评论(0)    收藏  举报